package api import ( "context" "git.infra.nkode.tech/dkelly/nkode-core/email" "git.infra.nkode.tech/dkelly/nkode-core/entities" "git.infra.nkode.tech/dkelly/nkode-core/repository" "git.infra.nkode.tech/dkelly/nkode-core/security" "github.com/stretchr/testify/assert" "log" "os" "testing" ) func TestNKodeAPI(t *testing.T) { //db1 := NewInMemoryDb() //testNKodeAPI(t, &db1) dbPath := os.Getenv("TEST_DB") ctx := context.Background() sqlitedb, err := repository.NewSqliteRepository(ctx, dbPath) if err != nil { log.Fatal(err) } sqlitedb.Start() defer func(sqldb *repository.SqliteRepository) { if err := sqldb.Stop(); err != nil { log.Fatal(err) } }(sqlitedb) testNKodeAPI(t, sqlitedb) } func testNKodeAPI(t *testing.T, db repository.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++ { rand, userEmail := entities.UserEmail("test_username" + security.GenerateNonSecureRandomString(12) + "@example.com") passcodeLen := 4 nkodePolicy := entities.NewDefaultNKodePolicy() keypadSize := entities.KeypadDimension{AttrsPerKey: attrsPerKey, NumbOfKeys: numbOfKeys} nkodeApi := NewNKodeAPI(db, queue) customerId, err := nkodeApi.CreateNewCustomer(nkodePolicy) assert.NoError(t, err) signupResponse, err := nkodeApi.GenerateSignupResetInterface(userEmail, *customerId, keypadSize, false) assert.NoError(t, err) setInterface := signupResponse.UserIdxInterface sessionIdStr := signupResponse.SessionId sessionId, err := entities.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 = entities.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) } }