From 56d0baad6e0a1b8cc3d952bd741d09f0696a0aa0 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 27 Jan 2025 14:00:18 +0300 Subject: [PATCH 01/11] test block account --- menutraversal_test/group_test.json | 43 +++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index 635e91d..410802b 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -140,7 +140,7 @@ }, { "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", @@ -438,6 +438,47 @@ "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" + } + ] } ] } \ No newline at end of file From bef62b97e7197e1ec37ca1a429aa78a375f60cf7 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 27 Jan 2025 14:00:42 +0300 Subject: [PATCH 02/11] extract remaining pin attempts --- menutraversal_test/menu_traversal_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/menutraversal_test/menu_traversal_test.go b/menutraversal_test/menu_traversal_test.go index 7d9e4f0..b040606 100644 --- a/menutraversal_test/menu_traversal_test.go +++ b/menutraversal_test/menu_traversal_test.go @@ -67,6 +67,16 @@ func extractMaxAmount(response []byte) string { return "" } +func extractRemainingAttempts(response []byte) string { + // Regex to match "You have: 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]) // "" of remaining attempts + } + return "" +} + // Extracts the send amount value from the engine response. func extractSendAmount(response []byte) string { // Regex to match the pattern "will receive X.XX SYM from" @@ -365,9 +375,11 @@ func TestGroups(t *testing.T) { } b := w.Bytes() balance := extractBalance(b) + attempts := extractRemainingAttempts(b) expectedContent := []byte(tt.ExpectedContent) expectedContent = bytes.Replace(expectedContent, []byte("{balance}"), []byte(balance), -1) + expectedContent = bytes.Replace(expectedContent, []byte("{attempts}"), []byte(attempts), -1) tt.ExpectedContent = string(expectedContent) From 416941944273d0dba038f92a10b5e18dad460cbc Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 28 Jan 2025 09:28:40 +0300 Subject: [PATCH 03/11] add test for reset without privileges --- menutraversal_test/group_test.json | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index 410802b..8550b75 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -74,6 +74,39 @@ } ] }, + { + "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": "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_check_my_balance", "steps": [ From 08212414271e060f091b5803d896cae82bfbf4cb Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 5 Feb 2025 10:23:31 +0300 Subject: [PATCH 04/11] repeat same node on invalid option --- services/registration/incorrect_pin.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/incorrect_pin.vis b/services/registration/incorrect_pin.vis index 167364a..74007a7 100644 --- a/services/registration/incorrect_pin.vis +++ b/services/registration/incorrect_pin.vis @@ -7,3 +7,4 @@ MOUT quit 9 HALT INCMP _ 1 INCMP quit 9 +INCMP . * From 8b999a09a2c1a751d361cefb189fa809ef5b1aa5 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 5 Feb 2025 18:04:29 +0300 Subject: [PATCH 05/11] add test cases --- menutraversal_test/group_test.json | 53 ++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index 8550b75..a2eca72 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -54,7 +54,7 @@ }, { "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", @@ -74,6 +74,47 @@ } ] }, + { + "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": "0700000000", + "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_no_privileges", "steps": [ @@ -93,14 +134,6 @@ "input": "2", "expectedContent": "You do not have privileges to perform this action\n\n9:Quit\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" @@ -128,7 +161,7 @@ }, { "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", From 4d461331943c42ace24e4f82d94326fece62ed2e Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Feb 2025 12:10:17 +0300 Subject: [PATCH 06/11] chore: add some spacing --- services/registration/confirm_others_new_pin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/confirm_others_new_pin b/services/registration/confirm_others_new_pin index d345a0a..720778b 100644 --- a/services/registration/confirm_others_new_pin +++ b/services/registration/confirm_others_new_pin @@ -1 +1 @@ -Please confirm new PIN for:{{.retrieve_blocked_number}} \ No newline at end of file +Please confirm new PIN for: {{.retrieve_blocked_number}} \ No newline at end of file From 3b03d402795a9e900190665fce0830e9afb44720 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Feb 2025 12:52:01 +0300 Subject: [PATCH 07/11] return the persister and flag parser --- testutil/engine.go | 12 ++++++++++-- testutil/engine_test.go | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/testutil/engine.go b/testutil/engine.go index a179b5d..0fc0122 100644 --- a/testutil/engine.go +++ b/testutil/engine.go @@ -9,7 +9,9 @@ import ( "path/filepath" "time" + "git.defalsify.org/vise.git/asm" "git.defalsify.org/vise.git/engine" + "git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/resource" "git.grassecon.net/grassrootseconomics/sarafu-api/remote" 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() err := config.Apply(override) if err != nil { @@ -75,6 +77,12 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) { logg.InfoCtxf(ctx, "loaded engine setup", "conns", conns) pfp := path.Join(scriptDir, "pp.csv") + parser := asm.NewFlagParser() + _, err = parser.Load(pfp) + if err != nil { + os.Exit(1) + } + var eventChannel = make(chan bool) cfg := engine.Config{ @@ -157,5 +165,5 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) { } logg.Infof("testengine storage closed") } - return en, cleanFn, eventChannel + return en, cleanFn, eventChannel, pe, parser } diff --git a/testutil/engine_test.go b/testutil/engine_test.go index f747468..dc22806 100644 --- a/testutil/engine_test.go +++ b/testutil/engine_test.go @@ -5,7 +5,7 @@ import ( ) func TestCreateEngine(t *testing.T) { - o, clean, eventC := TestEngine("foo") + o, clean, eventC, _, _ := TestEngine("foo") defer clean() defer func() { <-eventC From 278edc704909bfc41aa57ab88ff859c10ad0d97f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Feb 2025 13:31:18 +0300 Subject: [PATCH 08/11] test reset other's pin with registred and unregistred phone number --- menutraversal_test/group_test.json | 51 +++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index a2eca72..0e55fbd 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -94,7 +94,7 @@ "expectedContent": "Enter other's phone number:\n0:Back" }, { - "input": "0700000000", + "input": "0700000001", "expectedContent": "The number you have entered is either not registered with Sarafu or is invalid.\n1:Retry\n9:Quit" }, { @@ -115,6 +115,55 @@ } ] }, + { + "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": [ From fe74dbb8489c42340062ef909ee3141e05b12df1 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Feb 2025 15:37:05 +0300 Subject: [PATCH 09/11] add test for menu select voucher --- menutraversal_test/group_test.json | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index 0e55fbd..c6ccc1f 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -1,5 +1,63 @@ { "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": "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", "steps": [ From 9a63234470270fb028f8612615e4d5ef70bbb171 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Feb 2025 15:45:15 +0300 Subject: [PATCH 10/11] set and reset admin flag using persister's state --- menutraversal_test/menu_traversal_test.go | 74 +++++++++++++++++++---- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/menutraversal_test/menu_traversal_test.go b/menutraversal_test/menu_traversal_test.go index b040606..4cf8715 100644 --- a/menutraversal_test/menu_traversal_test.go +++ b/menutraversal_test/menu_traversal_test.go @@ -16,11 +16,12 @@ import ( ) var ( - logg = logging.NewVanilla().WithDomain("menutraversaltest") - testData = driver.ReadData() - sessionID string - src = rand.NewSource(42) - g = rand.New(src) + logg = logging.NewVanilla().WithDomain("menutraversaltest") + testData = driver.ReadData() + sessionID string + src = rand.NewSource(42) + 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") @@ -97,7 +98,43 @@ func TestMain(m *testing.M) { } 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() ctx := context.Background() sessions := testData @@ -140,7 +177,7 @@ func TestAccountRegistrationRejectTerms(t *testing.T) { t.Fail() } edgeCaseSessionID := v.String() - en, fn, _ := testutil.TestEngine(edgeCaseSessionID) + en, fn, _, _, _ := testutil.TestEngine(edgeCaseSessionID) defer fn() ctx := context.Background() sessions := testData @@ -176,7 +213,7 @@ func TestAccountRegistrationRejectTerms(t *testing.T) { } func TestMainMenuHelp(t *testing.T) { - en, fn, _ := testutil.TestEngine(sessionID) + en, fn, _, _, _ := testutil.TestEngine(sessionID) defer fn() ctx := context.Background() sessions := testData @@ -218,7 +255,7 @@ func TestMainMenuHelp(t *testing.T) { } func TestMainMenuQuit(t *testing.T) { - en, fn, _ := testutil.TestEngine(sessionID) + en, fn, _, _, _ := testutil.TestEngine(sessionID) defer fn() ctx := context.Background() sessions := testData @@ -259,7 +296,7 @@ func TestMainMenuQuit(t *testing.T) { } func TestMyAccount_MyAddress(t *testing.T) { - en, fn, _ := testutil.TestEngine(sessionID) + en, fn, _, _, _ := testutil.TestEngine(sessionID) defer fn() ctx := context.Background() sessions := testData @@ -303,7 +340,7 @@ func TestMyAccount_MyAddress(t *testing.T) { } func TestMainMenuSend(t *testing.T) { - en, fn, _ := testutil.TestEngine(sessionID) + en, fn, _, _, _ := testutil.TestEngine(sessionID) defer fn() ctx := context.Background() sessions := testData @@ -354,9 +391,12 @@ func TestGroups(t *testing.T) { if err != nil { log.Fatalf("Failed to load test groups: %v", err) } - en, fn, _ := testutil.TestEngine(sessionID) + en, fn, _, pe, flagParser := testutil.TestEngine(sessionID) defer fn() ctx := context.Background() + + flag_admin_privilege, _ := flagParser.GetFlag("flag_admin_privilege") + // Create test cases from loaded groups tests := driver.CreateTestCases(groups) for _, tt := range tests { @@ -377,9 +417,19 @@ func TestGroups(t *testing.T) { 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 = 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) From 7d11377ffd101d8554e2dbc51ce6c4a587046c10 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 11 Feb 2025 12:45:52 +0300 Subject: [PATCH 11/11] test empty input. --- menutraversal_test/group_test.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index c6ccc1f..f4bc2df 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -15,6 +15,10 @@ "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" @@ -106,6 +110,10 @@ "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": "", + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + }, { "input": "2", "expectedContent": "Please enter your PIN:" @@ -450,6 +458,10 @@ "input": "3", "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", "expectedContent": "Please enter your PIN:"