Skip to content

Commit 5625f77

Browse files
1. moved common test code to common
2. fixed postgres test Signed-off-by: [email protected] <[email protected]>
1 parent e6a5d23 commit 5625f77

File tree

6 files changed

+114
-78
lines changed

6 files changed

+114
-78
lines changed

platform/view/services/endpoint/service_test.go

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ package endpoint_test
88

99
import (
1010
"context"
11+
"regexp"
1112
"sync"
1213
"testing"
1314

15+
"github.com/DATA-DOG/go-sqlmock"
1416
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/endpoint"
1517
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/endpoint/mock"
1618
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
@@ -180,27 +182,49 @@ func TestGetIdentity(t *testing.T) {
180182
assert.False(t, ok)
181183
}
182184

183-
// func TestBindWithMultipleEphemerals(t *testing.T) {
184-
// RegisterTestingT(t)
185+
func TestPutBindings_MultipleEphemerals3(t *testing.T) {
186+
ctx := context.Background()
185187

186-
// ctx := context.Background()
187-
// longTerm := view.Identity("long")
188-
// e1 := view.Identity("eph1")
189-
// e2 := view.Identity("eph2")
190-
// e3 := view.Identity("eph3")
188+
// // Create mock DB and mock expectations
189+
_, mock1, err := sqlmock.New()
190+
// require.NoError(t, err)
191+
// defer func() { _ = db.Close() }()
191192

192-
// bindingStore := &mock.BindingStore{}
193-
// bindingStore.PutBindingReturns(nil)
193+
// // Wrap sqlmock's db into RWDB
194+
// rwdb := &common3.RWDB{
195+
// WriteDB: db,
196+
// ReadDB: db,
197+
// }
194198

195-
// service, err := endpoint.NewService(bindingStore)
196-
// require.NoError(t, err)
199+
// // Prepare table names
200+
// tables := common2.TableNames{
201+
// Binding: "bindings",
202+
// }
197203

198-
// Expect(service.Bind(ctx, longTerm, e1)).To(Succeed())
199-
// Expect(service.lastBindSql).To(Equal("INSERT ..."))
204+
store := &mock.BindingStore{}
200205

201-
// Expect(service.Bind(ctx, longTerm, e1, e2)).To(Succeed())
202-
// Expect(service.lastBindSql).To(Equal("INSERT ..."))
206+
// Create store using constructor
207+
// store, err := NewBindingStore(rwdb, tables)
208+
// require.NoError(t, err)
203209

204-
// Expect(service.Bind(ctx, longTerm, e1, e2, e3)).To(Succeed())
205-
// Expect(service.lastBindSql).To(Equal("INSERT ..."))
206-
// }
210+
// Input identities
211+
longTerm := view.Identity("long")
212+
e1 := view.Identity("eph1")
213+
e2 := view.Identity("eph2")
214+
215+
// Expected SQL query
216+
217+
expectedSQL := regexp.QuoteMeta(`SELECT long_term_id FROM bindings WHERE ephemeral_hash = $1`)
218+
mock1.ExpectQuery(expectedSQL).
219+
WithArgs(longTerm.UniqueID()).
220+
WillReturnRows(sqlmock.NewRows([]string{"long_term_id"})) // empty rows = no results
221+
222+
expectedSQL = regexp.QuoteMeta(`INSERT INTO bindings (ephemeral_hash, long_term_id) VALUES ($1, $2), ($3, $4), ($5, $6) ON CONFLICT DO NOTHING;`)
223+
mock1.ExpectExec(expectedSQL).
224+
WithArgs(longTerm.UniqueID(), longTerm, e1.UniqueID(), longTerm, e2.UniqueID(), longTerm).
225+
WillReturnResult(sqlmock.NewResult(1, 2))
226+
227+
err = store.PutBindings(ctx, longTerm, e1, e2)
228+
require.NoError(t, err)
229+
require.NoError(t, mock1.ExpectationsWereMet())
230+
}

platform/view/services/storage/driver/sql/common/test_utils.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@ SPDX-License-Identifier: Apache-2.0
77
package common
88

99
import (
10+
"context"
11+
"regexp"
1012
"testing"
1113

14+
"github.com/DATA-DOG/go-sqlmock"
1215
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils"
1316
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/driver"
17+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
18+
"github.com/stretchr/testify/require"
1419
_ "modernc.org/sqlite"
1520
)
1621

@@ -52,3 +57,28 @@ func TestCases(t *testing.T,
5257
})
5358
}
5459
}
60+
61+
func PutBindings(t *testing.T, store driver.BindingStore, mock sqlmock.Sqlmock) {
62+
ctx := context.Background()
63+
64+
// Input identities
65+
longTerm := view.Identity("long")
66+
e1 := view.Identity("eph1")
67+
e2 := view.Identity("eph2")
68+
69+
// Expected SQL query
70+
71+
expectedSQL := regexp.QuoteMeta(`SELECT long_term_id FROM bindings WHERE ephemeral_hash = $1`)
72+
mock.ExpectQuery(expectedSQL).
73+
WithArgs(longTerm.UniqueID()).
74+
WillReturnRows(sqlmock.NewRows([]string{"long_term_id"})) // empty rows = no results
75+
76+
expectedSQL = regexp.QuoteMeta(`INSERT INTO bindings (ephemeral_hash, long_term_id) VALUES ($1, $2), ($3, $4), ($5, $6) ON CONFLICT DO NOTHING;`)
77+
mock.ExpectExec(expectedSQL).
78+
WithArgs(longTerm.UniqueID(), longTerm, e1.UniqueID(), longTerm, e2.UniqueID(), longTerm).
79+
WillReturnResult(sqlmock.NewResult(1, 2))
80+
81+
err := store.PutBindings(ctx, longTerm, e1, e2)
82+
require.NoError(t, err)
83+
require.NoError(t, mock.ExpectationsWereMet())
84+
}

platform/view/services/storage/driver/sql/postgres/binding.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (db *BindingStore) PutBindings(ctx context.Context, longTerm view.Identity,
6161
query := fmt.Sprintf(`INSERT INTO %s (ephemeral_hash, long_term_id) VALUES `, db.table)
6262

6363
args := []interface{}{}
64-
argsReferences := []string{"($1,$2)"}
64+
argsReferences := []string{"($1, $2)"}
6565
args = append(args, longTerm.UniqueID(), longTerm)
6666
for i, eph := range ephemeral {
6767
args = append(args, eph.UniqueID(), longTerm)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package postgres
8+
9+
import (
10+
"testing"
11+
12+
"github.com/DATA-DOG/go-sqlmock"
13+
common3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/driver/common"
14+
common2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/driver/sql/common"
15+
"github.com/stretchr/testify/require"
16+
)
17+
18+
func TestPutBindings_MultipleEphemerals(t *testing.T) {
19+
// Create mock DB and mock expectations
20+
db, mock, err := sqlmock.New()
21+
require.NoError(t, err)
22+
defer func() { _ = db.Close() }()
23+
24+
// Wrap sqlmock's db into RWDB
25+
rwdb := &common3.RWDB{
26+
WriteDB: db,
27+
ReadDB: db,
28+
}
29+
30+
// Prepare table names
31+
tables := common2.TableNames{
32+
Binding: "bindings",
33+
}
34+
35+
// Create store using constructor
36+
store, err := NewBindingStore(rwdb, tables)
37+
require.NoError(t, err)
38+
39+
common2.PutBindings(t, store, mock)
40+
}

platform/view/services/storage/driver/sql/sqlite/binding.go

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -40,40 +40,6 @@ func newBindingStore(readDB *sql.DB, writeDB common2.WriteDB, table string) *Bin
4040
}
4141
}
4242

43-
// func (db *BindingStore) PutBinding(ctx context.Context, longTerm view.Identity, ephemeral view.Identity) error {
44-
// logger.DebugfContext(ctx, "put binding for pair [%s:%s]", ephemeral.UniqueID(), longTerm.UniqueID())
45-
// if lt, err := db.GetLongTerm(ctx, longTerm); err != nil {
46-
// return err
47-
// } else if lt != nil && !lt.IsNone() {
48-
// logger.DebugfContext(ctx, "replacing [%s] with long term [%s]", longTerm.UniqueID(), lt.UniqueID())
49-
// longTerm = lt
50-
// } else {
51-
// logger.DebugfContext(ctx, "Id [%s] is an unregistered long term ID", longTerm.UniqueID())
52-
// }
53-
// query := fmt.Sprintf(`
54-
// BEGIN;
55-
// INSERT INTO %s (ephemeral_hash, long_term_id)
56-
// VALUES ($1, $2)
57-
// ON CONFLICT DO NOTHING;
58-
// INSERT INTO %s (ephemeral_hash, long_term_id)
59-
// VALUES ($3, $4)
60-
// ON CONFLICT DO NOTHING;
61-
// COMMIT;
62-
// `, db.table, db.table)
63-
64-
// logger.Debug(query, ephemeral.UniqueID(), longTerm.UniqueID())
65-
// _, err := db.writeDB.ExecContext(ctx, query, ephemeral.UniqueID(), longTerm, longTerm.UniqueID(), longTerm)
66-
// if err == nil {
67-
// logger.DebugfContext(ctx, "long-term and ephemeral ids registered [%s,%s]", longTerm, ephemeral)
68-
// return nil
69-
// }
70-
// if errors.Is(db.errorWrapper.WrapError(err), driver.UniqueKeyViolation) {
71-
// logger.InfofContext(ctx, "tuple [%s,%s] already in db. Skipping...", ephemeral, longTerm)
72-
// return nil
73-
// }
74-
// return errors.Wrapf(err, "failed executing query [%s]", query)
75-
// }
76-
7743
func (db *BindingStore) PutBindings(ctx context.Context, longTerm view.Identity, ephemeral ...view.Identity) error {
7844
if len(ephemeral) == 0 {
7945
return nil

platform/view/services/storage/driver/sql/sqlite/binding_test.go

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,15 @@ SPDX-License-Identifier: Apache-2.0
77
package sqlite
88

99
import (
10-
"context"
11-
"regexp"
1210
"testing"
1311

1412
"github.com/DATA-DOG/go-sqlmock"
1513
common3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/driver/common"
1614
common2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/driver/sql/common"
17-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
1815
"github.com/stretchr/testify/require"
1916
)
2017

2118
func TestPutBindings_MultipleEphemerals(t *testing.T) {
22-
ctx := context.Background()
23-
2419
// Create mock DB and mock expectations
2520
db, mock, err := sqlmock.New()
2621
require.NoError(t, err)
@@ -41,24 +36,5 @@ func TestPutBindings_MultipleEphemerals(t *testing.T) {
4136
store, err := NewBindingStore(rwdb, tables)
4237
require.NoError(t, err)
4338

44-
// Input identities
45-
longTerm := view.Identity("long")
46-
e1 := view.Identity("eph1")
47-
e2 := view.Identity("eph2")
48-
49-
// Expected SQL query
50-
51-
expectedSQL := regexp.QuoteMeta(`SELECT long_term_id FROM bindings WHERE ephemeral_hash = $1`)
52-
mock.ExpectQuery(expectedSQL).
53-
WithArgs(longTerm.UniqueID()).
54-
WillReturnRows(sqlmock.NewRows([]string{"long_term_id"})) // empty rows = no results
55-
56-
expectedSQL = regexp.QuoteMeta(`INSERT INTO bindings (ephemeral_hash, long_term_id) VALUES ($1, $2), ($3, $4), ($5, $6) ON CONFLICT DO NOTHING;`)
57-
mock.ExpectExec(expectedSQL).
58-
WithArgs(longTerm.UniqueID(), longTerm, e1.UniqueID(), longTerm, e2.UniqueID(), longTerm).
59-
WillReturnResult(sqlmock.NewResult(1, 2))
60-
61-
err = store.PutBindings(ctx, longTerm, e1, e2)
62-
require.NoError(t, err)
63-
require.NoError(t, mock.ExpectationsWereMet())
39+
common2.PutBindings(t, store, mock)
6440
}

0 commit comments

Comments
 (0)