Skip to content

Commit b6f2157

Browse files
address comments and align code
1 parent 4c54f17 commit b6f2157

File tree

11 files changed

+1971
-87
lines changed

11 files changed

+1971
-87
lines changed

modules/pubmatic/openwrap/beforevalidationhook_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5584,7 +5584,9 @@ func TestOpenWrapHandleBeforeValidationHook(t *testing.T) {
55845584
mockFeature.EXPECT().IsTBFFeatureEnabled(gomock.Any(), gomock.Any()).Return(false)
55855585
mockFeature.EXPECT().IsAnalyticsTrackingThrottled(gomock.Any(), gomock.Any()).Return(false, false)
55865586
mockFeature.EXPECT().IsMaxFloorsEnabled(gomock.Any()).Return(false)
5587-
mockFeature.EXPECT().IsMBMFCountry(gomock.Any()).Return(false)
5587+
mockFeature.EXPECT().IsMBMFCountry(gomock.Any()).Return(true)
5588+
mockFeature.EXPECT().IsMBMFPublisherEnabled(gomock.Any()).Return(true)
5589+
mockFeature.EXPECT().GetProfileAdUnitMultiFloors(1234).Return(map[string]*models.MultiFloors{"adunit": {IsActive: true, Tier1: 1.1, Tier2: 2.1, Tier3: 3.1}})
55885590
mockProfileMetaData.EXPECT().GetProfileTypePlatform(gomock.Any()).Return(0, false)
55895591
},
55905592
want: want{
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package gocache
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/golang/mock/gomock"
8+
gocache "github.com/patrickmn/go-cache"
9+
"github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/config"
10+
"github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/database"
11+
mock_database "github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/database/mock"
12+
"github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/metrics"
13+
mock_metrics "github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/metrics/mock"
14+
"github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/models"
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
func TestCacheGetProfileAdUnitMultiFloors(t *testing.T) {
19+
ctrl := gomock.NewController(t)
20+
defer ctrl.Finish()
21+
mockDatabase := mock_database.NewMockDatabase(ctrl)
22+
mockEngine := mock_metrics.NewMockMetricsEngine(ctrl)
23+
24+
type fields struct {
25+
cache *gocache.Cache
26+
cfg config.Cache
27+
db database.Database
28+
metricEngine metrics.MetricsEngine
29+
}
30+
31+
tests := []struct {
32+
name string
33+
fields fields
34+
setup func()
35+
want models.ProfileAdUnitMultiFloors
36+
wantErr error
37+
}{
38+
{
39+
name: "Success case",
40+
fields: fields{
41+
cache: gocache.New(100, 100),
42+
db: mockDatabase,
43+
cfg: config.Cache{
44+
CacheDefaultExpiry: 1000,
45+
},
46+
metricEngine: mockEngine,
47+
},
48+
setup: func() {
49+
expectedFloors := models.ProfileAdUnitMultiFloors{
50+
1: map[string]*models.MultiFloors{
51+
"adunit1": {IsActive: true, Tier1: 1.0, Tier2: 0.8, Tier3: 0.6},
52+
},
53+
}
54+
mockDatabase.EXPECT().GetProfileAdUnitMultiFloors().Return(expectedFloors, nil)
55+
},
56+
want: models.ProfileAdUnitMultiFloors{
57+
1: map[string]*models.MultiFloors{
58+
"adunit1": {IsActive: true, Tier1: 1.0, Tier2: 0.8, Tier3: 0.6},
59+
},
60+
},
61+
wantErr: nil,
62+
},
63+
{
64+
name: "Database error",
65+
fields: fields{
66+
cache: gocache.New(100, 100),
67+
db: mockDatabase,
68+
cfg: config.Cache{
69+
CacheDefaultExpiry: 1000,
70+
},
71+
metricEngine: mockEngine,
72+
},
73+
setup: func() {
74+
mockDatabase.EXPECT().GetProfileAdUnitMultiFloors().Return(models.ProfileAdUnitMultiFloors{}, errors.New("db error"))
75+
mockEngine.EXPECT().RecordDBQueryFailure(models.ProfileAdUnitMultiFloorsQuery, "", "").Return()
76+
},
77+
want: models.ProfileAdUnitMultiFloors{},
78+
wantErr: errors.New("db error"),
79+
},
80+
}
81+
82+
for _, tt := range tests {
83+
t.Run(tt.name, func(t *testing.T) {
84+
if tt.setup != nil {
85+
tt.setup()
86+
}
87+
88+
c := &cache{
89+
cache: tt.fields.cache,
90+
cfg: tt.fields.cfg,
91+
db: tt.fields.db,
92+
metricEngine: tt.fields.metricEngine,
93+
}
94+
95+
got, err := c.GetProfileAdUnitMultiFloors()
96+
assert.Equal(t, tt.wantErr, err)
97+
assert.Equal(t, tt.want, got)
98+
})
99+
}
100+
}

modules/pubmatic/openwrap/database/mysql/mbmf.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ func (db *mySqlDB) GetProfileAdUnitMultiFloors() (models.ProfileAdUnitMultiFloor
4343
}
4444

4545
if err := rows.Err(); err != nil {
46-
return profileAdUnitMultiFloors, err
46+
glog.Errorf("Failed to fetch profile ad unit multi floors row from DB with` error: %s", err.Error())
47+
return models.ProfileAdUnitMultiFloors{}, err
4748
}
4849
return profileAdUnitMultiFloors, nil
4950
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
package mysql
2+
3+
import (
4+
"database/sql"
5+
"errors"
6+
"testing"
7+
8+
"github.com/DATA-DOG/go-sqlmock"
9+
"github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/config"
10+
"github.com/prebid/prebid-server/v3/modules/pubmatic/openwrap/models"
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestMySqlDBGetProfileAdUnitMultiFloors(t *testing.T) {
15+
type fields struct {
16+
cfg config.Database
17+
}
18+
19+
tests := []struct {
20+
name string
21+
fields fields
22+
setup func() *sql.DB
23+
want models.ProfileAdUnitMultiFloors
24+
wantErr error
25+
}{
26+
{
27+
name: "Rows error",
28+
fields: fields{
29+
cfg: config.Database{
30+
MaxDbContextTimeout: 5,
31+
Queries: config.Queries{
32+
GetProfileAdUnitMultiFloors: "SELECT",
33+
},
34+
},
35+
},
36+
setup: func() *sql.DB {
37+
db, mock, err := sqlmock.New()
38+
if err != nil {
39+
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
40+
}
41+
rows := sqlmock.NewRows([]string{"adunit_name", "profile_id", "value"}).
42+
RowError(0, errors.New("row error")).
43+
AddRow("adunit1", 123, `{"isActive":true,"tier1":1.0,"tier2":0.8,"tier3":0.6}`)
44+
mock.ExpectQuery("SELECT").WillReturnRows(rows)
45+
return db
46+
},
47+
want: models.ProfileAdUnitMultiFloors{},
48+
wantErr: nil,
49+
},
50+
{
51+
name: "Success case",
52+
fields: fields{
53+
cfg: config.Database{
54+
MaxDbContextTimeout: 5,
55+
Queries: config.Queries{
56+
GetProfileAdUnitMultiFloors: "SELECT",
57+
},
58+
},
59+
},
60+
setup: func() *sql.DB {
61+
db, mock, err := sqlmock.New()
62+
if err != nil {
63+
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
64+
}
65+
rows := sqlmock.NewRows([]string{"adunit_name", "profile_id", "value"}).
66+
AddRow("adunit1", 12344, `{"isActive":true,"tier1":1.0,"tier2":0.8,"tier3":0.6}`).
67+
AddRow("adunit2", 54532, `{"isActive":true,"tier1":2.0,"tier2":1.6,"tier3":1.2}`)
68+
mock.ExpectQuery("SELECT").WillReturnRows(rows)
69+
return db
70+
},
71+
want: models.ProfileAdUnitMultiFloors{
72+
12344: map[string]*models.MultiFloors{
73+
"adunit1": {IsActive: true, Tier1: 1.0, Tier2: 0.8, Tier3: 0.6},
74+
},
75+
54532: map[string]*models.MultiFloors{
76+
"adunit2": {IsActive: true, Tier1: 2.0, Tier2: 1.6, Tier3: 1.2},
77+
},
78+
},
79+
wantErr: nil,
80+
},
81+
{
82+
name: "Query error",
83+
fields: fields{
84+
cfg: config.Database{
85+
MaxDbContextTimeout: 5,
86+
Queries: config.Queries{
87+
GetProfileAdUnitMultiFloors: "SELECT",
88+
},
89+
},
90+
},
91+
setup: func() *sql.DB {
92+
db, mock, err := sqlmock.New()
93+
if err != nil {
94+
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
95+
}
96+
mock.ExpectQuery("SELECT").WillReturnError(sql.ErrConnDone)
97+
return db
98+
},
99+
want: models.ProfileAdUnitMultiFloors{},
100+
wantErr: sql.ErrConnDone,
101+
},
102+
{
103+
name: "Invalid JSON value",
104+
fields: fields{
105+
cfg: config.Database{
106+
MaxDbContextTimeout: 5,
107+
Queries: config.Queries{
108+
GetProfileAdUnitMultiFloors: "SELECT",
109+
},
110+
},
111+
},
112+
setup: func() *sql.DB {
113+
db, mock, err := sqlmock.New()
114+
if err != nil {
115+
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
116+
}
117+
rows := sqlmock.NewRows([]string{"adunit_name", "profile_id", "value"}).
118+
AddRow("adunit1", 1, `invalid json`)
119+
mock.ExpectQuery("SELECT").WillReturnRows(rows)
120+
return db
121+
},
122+
want: models.ProfileAdUnitMultiFloors{},
123+
wantErr: nil,
124+
},
125+
{
126+
name: "Row scan error",
127+
fields: fields{
128+
cfg: config.Database{
129+
MaxDbContextTimeout: 5,
130+
Queries: config.Queries{
131+
GetProfileAdUnitMultiFloors: "SELECT",
132+
},
133+
},
134+
},
135+
setup: func() *sql.DB {
136+
db, mock, err := sqlmock.New()
137+
if err != nil {
138+
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
139+
}
140+
rows := sqlmock.NewRows([]string{"adunit_name", "profile_id"}).
141+
AddRow("adunit1", 1)
142+
mock.ExpectQuery("SELECT").WillReturnRows(rows)
143+
return db
144+
},
145+
want: models.ProfileAdUnitMultiFloors{},
146+
wantErr: nil,
147+
},
148+
}
149+
150+
for _, tt := range tests {
151+
t.Run(tt.name, func(t *testing.T) {
152+
db := tt.setup()
153+
defer db.Close()
154+
155+
mysqlDB := &mySqlDB{
156+
conn: db,
157+
cfg: tt.fields.cfg,
158+
}
159+
160+
got, err := mysqlDB.GetProfileAdUnitMultiFloors()
161+
if tt.wantErr != nil {
162+
assert.Equal(t, tt.wantErr, err)
163+
} else {
164+
assert.NoError(t, err)
165+
assert.Equal(t, tt.want, got)
166+
}
167+
})
168+
}
169+
}

modules/pubmatic/openwrap/entrypointhook.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ func (m OpenWrap) handleEntrypointHook(
193193
return result, fmt.Errorf("invalid publisher id : %v", err)
194194
}
195195
rCtx.PubIDStr = pubIdStr
196-
197196
rCtx.WakandaDebug.EnableIfRequired(pubIdStr, rCtx.ProfileIDStr)
198197
if rCtx.WakandaDebug.IsEnable() {
199198
rCtx.WakandaDebug.SetHTTPRequestData(payload.Request, originalRequestBody)

0 commit comments

Comments
 (0)