Compare commits

..

49 Commits

Author SHA1 Message Date
0089d6f125 Merge pull request 'tests-menu-traversal' (#16) from tests-menu-traversal into master
Reviewed-on: #16
2025-02-13 10:00:42 +01:00
a7d13dc7c4 Merge branch 'master' into tests-menu-traversal 2025-02-13 09:59:11 +01:00
bed7f58e81 Merge pull request 'alfred/test-updates' (#15) from alfred/test-updates into master
Reviewed-on: #15
2025-02-13 09:58:45 +01:00
07fd1110ed
added documentation lines 2025-02-11 13:22:32 +03:00
2f1dbb9147
added TestClearTemporaryValue 2025-02-11 13:10:56 +03:00
93f1897321
Merge branch 'master' into tests-menu-traversal 2025-02-11 13:07:07 +03:00
c324e29aea
added test case to the TestCheckVouchers 2025-02-11 13:00:23 +03:00
f91056cca2 Merge branch 'master' into alfred/test-updates 2025-02-11 12:53:41 +03:00
7d11377ffd
test empty input. 2025-02-11 12:45:52 +03:00
9a63234470
set and reset admin flag using persister's state 2025-02-10 15:45:15 +03:00
fe74dbb848
add test for menu select voucher 2025-02-10 15:37:05 +03:00
278edc7049
test reset other's pin with registred and unregistred phone number 2025-02-10 13:31:18 +03:00
3b03d40279
return the persister and flag parser 2025-02-10 12:52:01 +03:00
4d46133194
chore: add some spacing 2025-02-10 12:10:17 +03:00
fd84f6ae98 Merge pull request 'debug-errors-with-temporary-value' (#22) from debug-errors-with-temporary-value into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #22
2025-02-06 14:43:59 +01:00
1190c5b6f2 Merge branch 'master' into alfred/test-updates 2025-02-06 15:19:40 +03:00
14df16098c
Updated tests to include the mockState 2025-02-06 15:10:15 +03:00
1cdd5a37ae Merge branch 'master' into alfred/test-updates 2025-02-06 15:02:18 +03:00
8b999a09a2
add test cases 2025-02-05 18:04:29 +03:00
0821241427
repeat same node on invalid option 2025-02-05 10:23:31 +03:00
ca71062528
Merge branch 'master' into tests-menu-traversal 2025-02-05 09:11:16 +03:00
c78081fb84
added TestInsertOrShift 2025-02-04 11:42:14 +03:00
ff3c597158
added TestUpdateAllProfileItems 2025-02-04 11:03:23 +03:00
09c5f3a14c
added TestInsertProfileItems 2025-02-04 10:30:39 +03:00
4169419442
add test for reset without privileges 2025-01-28 09:28:40 +03:00
bef62b97e7
extract remaining pin attempts 2025-01-27 14:00:42 +03:00
56d0baad6e
test block account 2025-01-27 14:00:18 +03:00
5a586eb67a
added TestConstructAccountAlias 2025-01-27 13:31:00 +03:00
6a945f8f20
added TestResetUnregisteredNumber 2025-01-27 12:53:02 +03:00
39f8c86e8b
added TestResetValidPin 2025-01-27 12:50:46 +03:00
73b501c8aa
removed left over commented code 2025-01-27 12:42:48 +03:00
a6cd4b5fca
added TestResetOthersPin 2025-01-27 12:36:04 +03:00
d47bc6c241 Merge branch 'master' into alfred/test-updates 2025-01-27 12:23:13 +03:00
dd55906e70
added TestGetCurrentProfileInfo 2025-01-27 11:35:05 +03:00
6fdf3735d0
added TestCheckBlockedNumPinMisMatch 2025-01-27 10:52:43 +03:00
b492421851
enhanced the TestSaveOthersTemporaryPin 2025-01-27 10:40:35 +03:00
128c0162d2
added TestSaveOthersTemporaryPin 2025-01-27 02:13:53 +03:00
ebe94c705f
added TestValidateBlockedNumber 2025-01-27 01:46:14 +03:00
df0c1b3429
added TestQuitWithHelp and TestShowBlockedAccount 2025-01-27 01:25:01 +03:00
d66fd894bc
added TestMaxAmount 2025-01-27 01:17:44 +03:00
28185fc2c5
added TestRetrieveBlockedNumber 2025-01-27 01:05:32 +03:00
64a87231ca
removed redundant type from array 2025-01-24 15:43:42 +03:00
0e480e3d55
enhanced the TestViewTransactionStatement 2025-01-23 16:08:04 +03:00
ffea1a0b96
added TestViewTransactionStatement 2025-01-23 15:54:50 +03:00
be5bd16616
added TestGetTransactionsList 2025-01-23 15:06:12 +03:00
93723616f6
added TestCheckTransactions 2025-01-23 13:42:17 +03:00
c9257ba0d6
added TestPersistInitialLanguageCode 2025-01-23 11:47:12 +03:00
caabf4f8af
updated the structure of TestPersistLanguageCode 2025-01-23 11:30:25 +03:00
f884b19012
added TestCheckBlockedStatus 2025-01-23 11:29:57 +03:00
10 changed files with 1574 additions and 33 deletions

View File

@ -102,14 +102,12 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService
return h, nil return h, nil
} }
// WithPersister sets persister instance to the handlers. // SetPersister sets persister instance to the handlers.
// func (h *MenuHandlers) WithPersister(pe *persist.Persister) *MenuHandlers {
func (h *MenuHandlers) SetPersister(pe *persist.Persister) { func (h *MenuHandlers) SetPersister(pe *persist.Persister) {
if h.pe != nil { if h.pe != nil {
panic("persister already set") panic("persister already set")
} }
h.pe = pe h.pe = pe
//return h
} }
// Init initializes the handler for a new session. // Init initializes the handler for a new session.
@ -2307,6 +2305,7 @@ func (h *MenuHandlers) ViewTransactionStatement(ctx context.Context, sym string,
return res, nil return res, nil
} }
// persistInitialLanguageCode receives an initial language code and persists it to the store
func (h *MenuHandlers) persistInitialLanguageCode(ctx context.Context, sessionId string, code string) error { func (h *MenuHandlers) persistInitialLanguageCode(ctx context.Context, sessionId string, code string) error {
store := h.userdataStore store := h.userdataStore
_, err := store.ReadEntry(ctx, sessionId, storedb.DATA_INITIAL_LANGUAGE_CODE) _, err := store.ReadEntry(ctx, sessionId, storedb.DATA_INITIAL_LANGUAGE_CODE)
@ -2339,6 +2338,8 @@ func (h *MenuHandlers) persistLanguageCode(ctx context.Context, code string) err
return h.persistInitialLanguageCode(ctx, sessionId, code) return h.persistInitialLanguageCode(ctx, sessionId, code)
} }
// constructAccountAlias retrieves and alias based on the first and family name
// and writes the result in DATA_ACCOUNT_ALIAS
func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error { func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error {
var alias string var alias string
store := h.userdataStore store := h.userdataStore
@ -2383,6 +2384,8 @@ func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error {
return nil return nil
} }
// ClearTemporaryValue empties the DATA_TEMPORARY_VALUE at the main menu to prevent
// previously stored data from being accessed
func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, input []byte) (resource.Result, error) { func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, input []byte) (resource.Result, error) {
var res resource.Result var res resource.Result
sessionId, ok := ctx.Value("SessionId").(string) sessionId, ok := ctx.Value("SessionId").(string)

File diff suppressed because it is too large Load Diff

View File

@ -66,7 +66,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
if err != nil { if err != nil {
return nil, err return nil, err
} }
//appHandlers = appHandlers.WithPersister(ls.Pe)
appHandlers.SetPersister(ls.Pe) appHandlers.SetPersister(ls.Pe)
ls.DbRs.AddLocalFunc("check_blocked_status", appHandlers.CheckBlockedStatus) ls.DbRs.AddLocalFunc("check_blocked_status", appHandlers.CheckBlockedStatus)
ls.DbRs.AddLocalFunc("set_language", appHandlers.SetLanguage) ls.DbRs.AddLocalFunc("set_language", appHandlers.SetLanguage)

View File

@ -1,5 +1,67 @@
{ {
"groups": [ "groups": [
{
"name": "main_my_vouchers_select_voucher_using_index",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "2",
"expectedContent": "My vouchers\n1:Select voucher\n2:Voucher details\n0:Back"
},
{
"input": "1",
"expectedContent": "Select number or symbol from your vouchers:\n1SRF\n0:Back\n99:Quit"
},
{
"input": "",
"expectedContent": "Select number or symbol from your vouchers:\n1SRF\n0:Back\n99:Quit"
},
{
"input": "1",
"expectedContent": "Enter PIN to confirm selection:\nSymbol: SRF\nBalance: 2.745987\n0:Back\n9:Quit"
},
{
"input": "1234",
"expectedContent": "Success! SRF is now your active voucher.\n0:Back\n9:Quit"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "main_my_vouchers_select_voucher_using_symbol",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "2",
"expectedContent": "My vouchers\n1:Select voucher\n2:Voucher details\n0:Back"
},
{
"input": "1",
"expectedContent": "Select number or symbol from your vouchers:\n1SRF\n0:Back\n99:Quit"
},
{
"input": "SRF",
"expectedContent": "Enter PIN to confirm selection:\nSymbol: SRF\nBalance: 2.745987\n0:Back\n9:Quit"
},
{
"input": "1234",
"expectedContent": "Success! SRF is now your active voucher.\n0:Back\n9:Quit"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{ {
"name": "my_account_change_pin", "name": "my_account_change_pin",
"steps": [ "steps": [
@ -48,13 +110,17 @@
"input": "3", "input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
}, },
{
"input": "",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
},
{ {
"input": "2", "input": "2",
"expectedContent": "Please enter your PIN:" "expectedContent": "Please enter your PIN:"
}, },
{ {
"input": "1235", "input": "1235",
"expectedContent": "Incorrect PIN. You have: 2 remaining attempt(s).\n1:Retry\n9:Quit" "expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
}, },
{ {
"input": "1", "input": "1",
@ -74,6 +140,121 @@
} }
] ]
}, },
{
"name": "menu_my_account_reset_others_pin_with_unregistered_number",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
},
{
"input": "5",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "2",
"expectedContent": "Enter other's phone number:\n0:Back"
},
{
"input": "0700000001",
"expectedContent": "The number you have entered is either not registered with Sarafu or is invalid.\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Enter other's phone number:\n0:Back"
},
{
"input": "0",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "0",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "menu_my_account_reset_others_pin_with_registered_number",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
},
{
"input": "5",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "2",
"expectedContent": "Enter other's phone number:\n0:Back"
},
{
"input": "0700000000",
"expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back"
},
{
"input": "11111",
"expectedContent": "The PIN you have entered is invalid.Please try a 4 digit number instead.\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back"
},
{
"input": "1111",
"expectedContent": "Please confirm new PIN for: {secondary_session_id}\n0:Back"
},
{
"input": "1111",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1234",
"expectedContent": "PIN reset request for {secondary_session_id} was successful\n0:Back\n9:Quit"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "menu_my_account_reset_others_pin_with_no_privileges",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
},
{
"input": "5",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "2",
"expectedContent": "You do not have privileges to perform this action\n\n9:Quit\n0:Back"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{ {
"name": "menu_my_account_check_my_balance", "name": "menu_my_account_check_my_balance",
"steps": [ "steps": [
@ -95,7 +276,7 @@
}, },
{ {
"input": "1235", "input": "1235",
"expectedContent": "Incorrect PIN. You have: 2 remaining attempt(s).\n1:Retry\n9:Quit" "expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
}, },
{ {
"input": "1", "input": "1",
@ -140,7 +321,7 @@
}, },
{ {
"input": "1235", "input": "1235",
"expectedContent": "Incorrect PIN. You have: 2 remaining attempt(s).\n1:Retry\n9:Quit" "expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
}, },
{ {
"input": "1", "input": "1",
@ -277,6 +458,10 @@
"input": "3", "input": "3",
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back" "expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
}, },
{
"input": "",
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
},
{ {
"input": "1", "input": "1",
"expectedContent": "Please enter your PIN:" "expectedContent": "Please enter your PIN:"
@ -438,6 +623,47 @@
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
} }
] ]
},
{
"name": "menu_block_account_via_view_profile",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
},
{
"input": "1",
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
},
{
"input": "7",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1254",
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1254",
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1254",
"expectedContent": "Your account has been locked. For help on how to unblock your account, contact support at: 0757628885"
}
]
} }
] ]
} }

View File

@ -16,11 +16,12 @@ import (
) )
var ( var (
logg = logging.NewVanilla().WithDomain("menutraversaltest") logg = logging.NewVanilla().WithDomain("menutraversaltest")
testData = driver.ReadData() testData = driver.ReadData()
sessionID string sessionID string
src = rand.NewSource(42) src = rand.NewSource(42)
g = rand.New(src) g = rand.New(src)
secondarySessionId = "0700000000"
) )
var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests") var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests")
@ -67,6 +68,16 @@ func extractMaxAmount(response []byte) string {
return "" return ""
} }
func extractRemainingAttempts(response []byte) string {
// Regex to match "You have: <number> remaining attempt(s)"
re := regexp.MustCompile(`(?m)You have:\s+(\d+)\s+remaining attempt\(s\)`)
match := re.FindSubmatch(response)
if match != nil {
return string(match[1]) // "<number>" of remaining attempts
}
return ""
}
// Extracts the send amount value from the engine response. // Extracts the send amount value from the engine response.
func extractSendAmount(response []byte) string { func extractSendAmount(response []byte) string {
// Regex to match the pattern "will receive X.XX SYM from" // Regex to match the pattern "will receive X.XX SYM from"
@ -87,7 +98,43 @@ func TestMain(m *testing.M) {
} }
func TestAccountCreationSuccessful(t *testing.T) { func TestAccountCreationSuccessful(t *testing.T) {
en, fn, eventChannel := testutil.TestEngine(sessionID) en, fn, eventChannel, _, _ := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
sessions := testData
for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful")
for _, group := range groups {
for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
}
if !cont {
break
}
w := bytes.NewBuffer(nil)
_, err = en.Flush(ctx, w)
if err != nil {
t.Fatalf("Test case '%s' failed during Flush: %v", group.Name, err)
}
b := w.Bytes()
match, err := step.MatchesExpectedContent(b)
if err != nil {
t.Fatalf("Error compiling regex for step '%s': %v", step.Input, err)
}
if !match {
t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", step.ExpectedContent, b)
}
}
}
}
<-eventChannel
}
func TestSecondaryAccount(t *testing.T) {
en, fn, eventChannel, _, _ := testutil.TestEngine(secondarySessionId)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
sessions := testData sessions := testData
@ -130,7 +177,7 @@ func TestAccountRegistrationRejectTerms(t *testing.T) {
t.Fail() t.Fail()
} }
edgeCaseSessionID := v.String() edgeCaseSessionID := v.String()
en, fn, _ := testutil.TestEngine(edgeCaseSessionID) en, fn, _, _, _ := testutil.TestEngine(edgeCaseSessionID)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
sessions := testData sessions := testData
@ -166,7 +213,7 @@ func TestAccountRegistrationRejectTerms(t *testing.T) {
} }
func TestMainMenuHelp(t *testing.T) { func TestMainMenuHelp(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID) en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
sessions := testData sessions := testData
@ -208,7 +255,7 @@ func TestMainMenuHelp(t *testing.T) {
} }
func TestMainMenuQuit(t *testing.T) { func TestMainMenuQuit(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID) en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
sessions := testData sessions := testData
@ -249,7 +296,7 @@ func TestMainMenuQuit(t *testing.T) {
} }
func TestMyAccount_MyAddress(t *testing.T) { func TestMyAccount_MyAddress(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID) en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
sessions := testData sessions := testData
@ -293,7 +340,7 @@ func TestMyAccount_MyAddress(t *testing.T) {
} }
func TestMainMenuSend(t *testing.T) { func TestMainMenuSend(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID) en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
sessions := testData sessions := testData
@ -344,9 +391,12 @@ func TestGroups(t *testing.T) {
if err != nil { if err != nil {
log.Fatalf("Failed to load test groups: %v", err) log.Fatalf("Failed to load test groups: %v", err)
} }
en, fn, _ := testutil.TestEngine(sessionID) en, fn, _, pe, flagParser := testutil.TestEngine(sessionID)
defer fn() defer fn()
ctx := context.Background() ctx := context.Background()
flag_admin_privilege, _ := flagParser.GetFlag("flag_admin_privilege")
// Create test cases from loaded groups // Create test cases from loaded groups
tests := driver.CreateTestCases(groups) tests := driver.CreateTestCases(groups)
for _, tt := range tests { for _, tt := range tests {
@ -365,9 +415,21 @@ func TestGroups(t *testing.T) {
} }
b := w.Bytes() b := w.Bytes()
balance := extractBalance(b) balance := extractBalance(b)
attempts := extractRemainingAttempts(b)
st := pe.GetState()
if st != nil {
st.SetFlag(flag_admin_privilege)
if tt.Name == "menu_my_account_reset_others_pin_with_no_privileges" {
st.ResetFlag(flag_admin_privilege)
}
}
expectedContent := []byte(tt.ExpectedContent) expectedContent := []byte(tt.ExpectedContent)
expectedContent = bytes.Replace(expectedContent, []byte("{balance}"), []byte(balance), -1) expectedContent = bytes.Replace(expectedContent, []byte("{balance}"), []byte(balance), -1)
expectedContent = bytes.Replace(expectedContent, []byte("{attempts}"), []byte(attempts), -1)
expectedContent = bytes.Replace(expectedContent, []byte("{secondary_session_id}"), []byte(secondarySessionId), -1)
tt.ExpectedContent = string(expectedContent) tt.ExpectedContent = string(expectedContent)

42
profile/profile_test.go Normal file
View File

@ -0,0 +1,42 @@
package profile
import (
"testing"
"github.com/alecthomas/assert/v2"
"github.com/stretchr/testify/require"
)
func TestInsertOrShift(t *testing.T) {
tests := []struct {
name string
profile Profile
index int
value string
expected []string
}{
{
name: "Insert within range",
profile: Profile{ProfileItems: []string{"A", "B", "C"}, Max: 5},
index: 1,
value: "X",
expected: []string{"A", "X"},
},
{
name: "Insert beyond range",
profile: Profile{ProfileItems: []string{"A"}, Max: 5},
index: 3,
value: "Y",
expected: []string{"A", "0", "0", "Y"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := tt.profile
p.InsertOrShift(tt.index, tt.value)
require.NotNil(t, p.ProfileItems)
assert.Equal(t, tt.expected, p.ProfileItems)
})
}
}

View File

@ -1 +1 @@
Please confirm new PIN for:{{.retrieve_blocked_number}} Please confirm new PIN for: {{.retrieve_blocked_number}}

View File

@ -7,3 +7,4 @@ MOUT quit 9
HALT HALT
INCMP _ 1 INCMP _ 1
INCMP quit 9 INCMP quit 9
INCMP . *

View File

@ -9,7 +9,9 @@ import (
"path/filepath" "path/filepath"
"time" "time"
"git.defalsify.org/vise.git/asm"
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource" "git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote" "git.grassecon.net/grassrootseconomics/sarafu-api/remote"
httpremote "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" httpremote "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http"
@ -60,7 +62,7 @@ func CleanDatabase() {
} }
} }
func TestEngine(sessionId string) (engine.Engine, func(), chan bool) { func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Persister, *asm.FlagParser) {
config.LoadConfig() config.LoadConfig()
err := config.Apply(override) err := config.Apply(override)
if err != nil { if err != nil {
@ -75,6 +77,12 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) {
logg.InfoCtxf(ctx, "loaded engine setup", "conns", conns) logg.InfoCtxf(ctx, "loaded engine setup", "conns", conns)
pfp := path.Join(scriptDir, "pp.csv") pfp := path.Join(scriptDir, "pp.csv")
parser := asm.NewFlagParser()
_, err = parser.Load(pfp)
if err != nil {
os.Exit(1)
}
var eventChannel = make(chan bool) var eventChannel = make(chan bool)
cfg := engine.Config{ cfg := engine.Config{
@ -157,5 +165,5 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) {
} }
logg.Infof("testengine storage closed") logg.Infof("testengine storage closed")
} }
return en, cleanFn, eventChannel return en, cleanFn, eventChannel, pe, parser
} }

View File

@ -5,7 +5,7 @@ import (
) )
func TestCreateEngine(t *testing.T) { func TestCreateEngine(t *testing.T) {
o, clean, eventC := TestEngine("foo") o, clean, eventC, _, _ := TestEngine("foo")
defer clean() defer clean()
defer func() { defer func() {
<-eventC <-eventC