package api import ( "github.com/stretchr/testify/assert" "go-nkode/internal/db" "go-nkode/internal/email" "go-nkode/internal/entities" "go-nkode/internal/models" "go-nkode/internal/security" "os" "testing" ) func TestNKodeAPI(t *testing.T) { //db1 := NewInMemoryDb() //testNKodeAPI(t, &db1) dbFile := os.Getenv("TEST_DB") db2 := db.NewSqliteDB(dbFile) defer db2.CloseDb() testNKodeAPI(t, db2) //if _, err := os.Stat(dbFile); err == nil { // err = os.Remove(dbFile) // assert.NoError(t, err) //} else { // assert.NoError(t, err) //} } func testNKodeAPI(t *testing.T, db db.CustomerUserRepository) { bufferSize := 100 emailsPerSec := 14 testClient := email.TestEmailClient{} queue := email.NewEmailQueue(bufferSize, emailsPerSec, &testClient) queue.Start() defer queue.Stop() attrsPerKey := 5 numbOfKeys := 4 for idx := 0; idx < 1; idx++ { userEmail := models.UserEmail("test_username" + security.GenerateRandomString(12) + "@example.com") passcodeLen := 4 nkodePolicy := models.NewDefaultNKodePolicy() keypadSize := entities.KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} nkodeApi := NewNKodeAPI(db, queue) customerId, err := nkodeApi.CreateNewCustomer(nkodePolicy, nil) assert.NoError(t, err) signupResponse, err := nkodeApi.GenerateSignupResetInterface(userEmail, *customerId, keypadSize, false) assert.NoError(t, err) setInterface := signupResponse.UserIdxInterface sessionIdStr := signupResponse.SessionId sessionId, err := models.SessionIdFromString(sessionIdStr) assert.NoError(t, err) keypadSize = entities.KeypadDimension{AttrsPerKey: numbOfKeys, NumbOfKeys: numbOfKeys} userPasscode := setInterface[:passcodeLen] setKeySelect, err := entities.SelectKeyByAttrIdx(setInterface, userPasscode, keypadSize) assert.NoError(t, err) confirmInterface, err := nkodeApi.SetNKode(*customerId, sessionId, setKeySelect) assert.NoError(t, err) confirmKeySelect, err := entities.SelectKeyByAttrIdx(confirmInterface, userPasscode, keypadSize) err = nkodeApi.ConfirmNKode(*customerId, sessionId, confirmKeySelect) assert.NoError(t, err) keypadSize = entities.KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} loginInterface, err := nkodeApi.GetLoginInterface(userEmail, *customerId) assert.NoError(t, err) loginKeySelection, err := entities.SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize) assert.NoError(t, err) _, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection) assert.NoError(t, err) err = nkodeApi.RenewAttributes(*customerId) assert.NoError(t, err) loginInterface, err = nkodeApi.GetLoginInterface(userEmail, *customerId) assert.NoError(t, err) loginKeySelection, err = entities.SelectKeyByAttrIdx(loginInterface.UserIdxInterface, userPasscode, keypadSize) assert.NoError(t, err) _, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection) assert.NoError(t, err) /// Reset nKode attrsPerKey = 6 keypadSize = entities.KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} resetResponse, err := nkodeApi.GenerateSignupResetInterface(userEmail, *customerId, keypadSize, true) assert.NoError(t, err) setInterface = resetResponse.UserIdxInterface sessionIdStr = resetResponse.SessionId sessionId, err = models.SessionIdFromString(sessionIdStr) assert.NoError(t, err) keypadSize = entities.KeypadDimension{AttrsPerKey: numbOfKeys, NumbOfKeys: numbOfKeys} userPasscode = setInterface[:passcodeLen] setKeySelect, err = entities.SelectKeyByAttrIdx(setInterface, userPasscode, keypadSize) assert.NoError(t, err) confirmInterface, err = nkodeApi.SetNKode(*customerId, sessionId, setKeySelect) assert.NoError(t, err) confirmKeySelect, err = entities.SelectKeyByAttrIdx(confirmInterface, userPasscode, keypadSize) err = nkodeApi.ConfirmNKode(*customerId, sessionId, confirmKeySelect) assert.NoError(t, err) keypadSize = entities.KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} loginInterface2, err := nkodeApi.GetLoginInterface(userEmail, *customerId) assert.NoError(t, err) loginKeySelection, err = entities.SelectKeyByAttrIdx(loginInterface2.UserIdxInterface, userPasscode, keypadSize) assert.NoError(t, err) _, err = nkodeApi.Login(*customerId, userEmail, loginKeySelection) assert.NoError(t, err) signupResponse, err = nkodeApi.GenerateSignupResetInterface(userEmail, *customerId, keypadSize, false) assert.Error(t, err) } }