Compare commits

..

295 Commits

Author SHA1 Message Date
Carlosokumu
06cab56427 fix failing tests: menuhandlers missing the logdb 2025-04-29 13:25:31 +03:00
Carlosokumu
d0c181bca2 Merge branch 'master' into route-api-errors 2025-04-29 12:58:46 +03:00
e379129b3d Merge pull request 'logdb' (#56) from logdb into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #56
2025-04-29 09:15:50 +02:00
Carlosokumu
29d35d1ec4 add write of the temporary and confirmed account pins to the log db 2025-04-28 15:49:40 +03:00
alfred-mk
687447e73e added the logdb to the testutil engine 2025-04-28 15:09:38 +03:00
alfred-mk
ec1ddefeb3 updated packages for sarafu-api and vise 2025-04-28 12:50:36 +03:00
alfred-mk
4166c9aed5 Merge branch 'master' into logdb 2025-04-28 12:38:27 +03:00
alfred-mk
78e82edfb5 added the logdn to the menuhandler tests 2025-04-28 12:26:06 +03:00
Carlosokumu
a5c4866b23 add required logdb to menuhandler 2025-04-28 11:50:25 +03:00
Carlosokumu
b52239e6be use direct key data type 2025-04-28 11:50:10 +03:00
Carlosokumu
5f02df64d7 upgrade visedriver dep 2025-04-28 11:40:28 +03:00
alfred-mk
0ba65fc48c use the updated phone and alias regexes from common 2025-04-28 11:39:37 +03:00
alfred-mk
ce8cc8e0fd use latest commit from sarafu-api 2025-04-28 11:38:45 +03:00
Carlosokumu
1499e4a29a check recipient before sending an sms 2025-04-28 11:38:44 +03:00
Carlosokumu
5f24ff3b1b feat: send invites when a recipient
is not resolved
2025-04-28 11:38:44 +03:00
Carlosokumu
6cdee7b58b update sarafu-api dep 2025-04-28 11:38:43 +03:00
alfred-mk
af5537abfc updated the description of DATA_SELF_PIN_RESET 2025-04-28 11:37:45 +03:00
alfred-mk
a6e569afb1 remove the verify_new_pin functionality that managed the unused flag_valid_pin 2025-04-28 11:37:44 +03:00
alfred-mk
446514d8ce remove unused function reset_valid_pin 2025-04-28 11:37:44 +03:00
alfred-mk
131d106f38 use a single confirm_pin_change node 2025-04-28 11:37:43 +03:00
alfred-mk
4d62f0222e use the same check for flag_invalid_pin to move to the invalid_pin node 2025-04-28 11:37:43 +03:00
alfred-mk
37cc3e1bc1 cleanup: remove extra space in all .vis files 2025-04-28 11:37:42 +03:00
alfred-mk
491e97d8af cleanup: remove extra space 2025-04-28 11:37:42 +03:00
alfred-mk
d4fefe3c39 update the order for the INCMP statement 2025-04-28 11:37:41 +03:00
alfred-mk
e8ff468c7b update the reset flags in TestCheckBlockedStatus 2025-04-28 11:37:41 +03:00
alfred-mk
965f343230 update the reset flags in TestConfirmPinChange 2025-04-28 11:37:40 +03:00
alfred-mk
3426d31a9e use the correct flag_invalid_pin in TestSaveTemporaryPin 2025-04-28 11:37:40 +03:00
alfred-mk
8b2b667307 updated the expected content for the alias in view profile 2025-04-28 11:37:39 +03:00
alfred-mk
c206fa1329 updated the menu flow for the admin reset others PIN in test 2025-04-28 11:37:39 +03:00
alfred-mk
ad395c4b1a remove code related to admins resetting a user's actual PIN 2025-04-28 11:37:38 +03:00
alfred-mk
af7e6cc603 add a space 2025-04-28 11:37:38 +03:00
alfred-mk
f90a188acc updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin 2025-04-28 11:37:37 +03:00
alfred-mk
7a542d1f1c updated the description of the flag_incorrect_pin 2025-04-28 11:37:37 +03:00
alfred-mk
7d800d68a0 have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked 2025-04-28 11:37:36 +03:00
alfred-mk
850458b5d8 use a single pin_mismatch node for a confirmed PIN that does not match the original PIN 2025-04-28 11:37:36 +03:00
alfred-mk
ef8e3d5c35 allow the user to quit and move to invalid_pin node if the given input is invalid 2025-04-28 11:37:35 +03:00
alfred-mk
982eebf374 move to the top node when one selects back 2025-04-28 11:37:35 +03:00
alfred-mk
228d936a0e use the confirm_self_pin_reset to confirm the new PIN 2025-04-28 11:37:34 +03:00
alfred-mk
7c4d37b5b8 use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset 2025-04-28 11:37:33 +03:00
alfred-mk
e6e8bb6671 set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset 2025-04-28 11:37:33 +03:00
alfred-mk
6385735b89 move back to the previous node if the admin user is not authorized 2025-04-28 11:34:27 +03:00
alfred-mk
70815aabd1 request the admin to authorize the PIN reset 2025-04-28 11:34:27 +03:00
alfred-mk
919899c704 move to the authorize_reset_others_pin if the given number is valid and registered 2025-04-28 11:34:26 +03:00
alfred-mk
9a2ad99d07 updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality 2025-04-28 11:34:26 +03:00
alfred-mk
2f4959e191 use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset 2025-04-28 11:34:25 +03:00
alfred-mk
1b2f3bb046 added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin 2025-04-28 11:34:24 +03:00
carlos
19a2b28367 Merge pull request 'extra-sms' (#64) from extra-sms into master
Reviewed-on: #64
2025-04-28 10:33:25 +02:00
alfred-mk
25d124c58d use updated go-vise that removes rollback on missing key 2025-04-25 17:10:46 +03:00
alfred-mk
5b34ef28eb added the logDb to async and http 2025-04-25 09:33:08 +03:00
Carlosokumu
0370a3def4 use dedicated smsservice for triggering extra sms 2025-04-18 12:13:24 +03:00
Carlosokumu
7c0651d218 use dedicated sms package for triggering sms 2025-04-18 12:12:33 +03:00
Carlosokumu
a38ac06a3d trigger an address sms in the check_identifier handler 2025-04-18 10:56:41 +03:00
Carlosokumu
ac2a3721b2 remove dedicated address sms trigger 2025-04-18 10:55:02 +03:00
Carlosokumu
7ea3cb6b51 remove reload for check identifier to prevent double address sms trigger 2025-04-18 10:54:23 +03:00
Carlosokumu
0274133d48 add handler to send an address sms 2025-04-17 23:32:05 +03:00
Carlosokumu
5ff2e794ff feat: implement address and pin reset sms 2025-04-17 23:31:48 +03:00
Carlosokumu
08deeca500 register handler to trigger address sms 2025-04-17 23:31:22 +03:00
Carlosokumu
cea920c1f5 dep: upgrade sarafu-api dep to include address and pin reset sms 2025-04-17 23:30:54 +03:00
ade236747c Merge pull request 'use the updated phone and alias regexes from common' (#63) from update-recipient-validator into master
Reviewed-on: #63
2025-04-17 16:53:42 +02:00
alfred-mk
e1a3729e3b use the updated phone and alias regexes from common 2025-04-17 14:31:18 +03:00
Carlosokumu
f127fd7c0f initialize log db ,attach it to the menuhandler 2025-04-14 11:34:37 +03:00
alfred-mk
42177aadeb use latest commit from sarafu-api
Some checks failed
release / docker (push) Has been cancelled
2025-04-11 11:10:48 +03:00
fa9f1a72ef Merge pull request 'self pin reset' (#49) from self-pin-reset-node into master
Reviewed-on: #49
2025-04-11 09:26:11 +02:00
alfred-mk
4ffb32f14a Merge branch 'master' into self-pin-reset-node 2025-04-11 10:25:35 +03:00
c41277db87 Merge pull request 'sms-upsell' (#55) from sms-upsell into master
Reviewed-on: #55
2025-04-11 09:24:35 +02:00
alfred-mk
56cda36aa7 updated the description of DATA_SELF_PIN_RESET 2025-04-10 13:55:00 +03:00
alfred-mk
c9170ca45a Merge branch 'master' into self-pin-reset-node 2025-04-09 23:43:10 +03:00
alfred-mk
57a1645c03 remove the verify_new_pin functionality that managed the unused flag_valid_pin 2025-04-09 23:40:03 +03:00
alfred-mk
7d9c3b66a9 remove unused function reset_valid_pin 2025-04-09 19:29:40 +03:00
alfred-mk
aec1f4c4c1 use a single confirm_pin_change node 2025-04-09 19:23:46 +03:00
alfred-mk
d680387ef1 use the same check for flag_invalid_pin to move to the invalid_pin node 2025-04-09 19:21:35 +03:00
alfred-mk
0337c66f96 cleanup: remove extra space in all .vis files 2025-04-09 18:17:59 +03:00
alfred-mk
6070792fe4 cleanup: remove extra space 2025-04-09 18:14:10 +03:00
alfred-mk
69ae494b2c update the order for the INCMP statement 2025-04-09 18:10:51 +03:00
alfred-mk
b89abf3487 update the reset flags in TestCheckBlockedStatus 2025-04-09 18:06:24 +03:00
alfred-mk
4ef8c47f8b update the reset flags in TestConfirmPinChange 2025-04-09 18:01:40 +03:00
alfred-mk
1076a9578e use the correct flag_invalid_pin in TestSaveTemporaryPin 2025-04-09 17:57:54 +03:00
alfred-mk
a27d44e561 updated the expected content for the alias in view profile 2025-04-09 17:52:58 +03:00
alfred-mk
35a2732fe2 updated the menu flow for the admin reset others PIN in test 2025-04-09 17:52:18 +03:00
alfred-mk
834f2ce629 remove code related to admins resetting a user's actual PIN 2025-04-09 17:39:41 +03:00
alfred-mk
26353bdf6e add a space 2025-04-09 17:34:24 +03:00
alfred-mk
1f6bf2bbed updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin 2025-04-09 16:59:48 +03:00
alfred-mk
0c1d9ab582 updated the description of the flag_incorrect_pin 2025-04-09 16:58:13 +03:00
alfred-mk
29d94bb2e5 have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked 2025-04-09 16:57:22 +03:00
alfred-mk
067c496244 use a single pin_mismatch node for a confirmed PIN that does not match the original PIN 2025-04-09 16:55:46 +03:00
alfred-mk
f8c258a3b4 allow the user to quit and move to invalid_pin node if the given input is invalid 2025-04-09 16:49:04 +03:00
alfred-mk
aec96ce9ba move to the top node when one selects back 2025-04-09 15:19:23 +03:00
alfred-mk
71ef950fff use the confirm_self_pin_reset to confirm the new PIN 2025-04-09 15:12:51 +03:00
alfred-mk
477f3a307a use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset 2025-04-09 15:11:51 +03:00
alfred-mk
33c376c971 set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset 2025-04-09 15:10:12 +03:00
Carlosokumu
79bf09f3d1 add logdb to menuhandler and associated write operations 2025-04-09 14:55:35 +03:00
Carlosokumu
f4804546d9 add log db struct with associated methods 2025-04-09 14:52:57 +03:00
Carlosokumu
3fff03a164 update visedriver dep 2025-04-09 14:50:28 +03:00
Carlosokumu
094866c129 add a logdb field to lhs and setter function 2025-04-09 14:49:41 +03:00
alfred-mk
514f6ae05b move back to the previous node if the admin user is not authorized 2025-04-08 16:26:21 +03:00
alfred-mk
8a6659a98b request the admin to authorize the PIN reset 2025-04-08 16:25:50 +03:00
alfred-mk
d094af9c51 move to the authorize_reset_others_pin if the given number is valid and registered 2025-04-08 16:25:11 +03:00
alfred-mk
f96f9c11e6 updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality 2025-04-08 16:23:21 +03:00
Carlosokumu
1d8b0ef951 Merge branch 'master' into sms-upsell 2025-04-07 11:45:29 +03:00
Carlosokumu
fb2dc003b8 check recipient before sending an sms 2025-04-07 11:38:52 +03:00
alfred-mk
a11ca2a618 reset the flag_language_set and flag_account_created flags if the publicKey does not exist on the db
Some checks failed
release / docker (push) Has been cancelled
2025-04-04 12:05:04 +03:00
4268cc0589 build: logdebug mode
Some checks failed
release / docker (push) Has been cancelled
2025-04-03 15:45:41 +03:00
alfred-mk
ae0672c7da updated the vise version to pop the cache on a new session
Some checks failed
release / docker (push) Has been cancelled
2025-04-02 18:34:04 +03:00
alfred-mk
2c671bc0d4 use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset 2025-04-02 18:29:04 +03:00
alfred-mk
c5673b339b added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin 2025-04-02 18:24:34 +03:00
Carlosokumu
58242c8d55 fix failing test: TestManageVouchers 2025-04-02 10:53:36 +03:00
Carlosokumu
cab90ed89a set and reset flag_api_error flag 2025-04-02 10:48:04 +03:00
Carlosokumu
73c3486400 catch api call failure when manage vouchers is called 2025-04-02 10:47:33 +03:00
Carlosokumu
3c84fb5ae7 Merge branch 'master' into route-api-errors 2025-04-02 10:38:47 +03:00
c3567313af Merge pull request 'manage vouchers in single function' (#42) from manage-vouchers-in-single-function into master
Reviewed-on: #42
2025-04-01 21:26:28 +02:00
f82b413e34 Merge branch 'master' into manage-vouchers-in-single-function 2025-04-01 21:26:16 +02:00
Carlosokumu
695bfed349 feat: send invites when a recipient
is not resolved
2025-04-01 16:30:08 +03:00
Carlosokumu
8bf48cb081 update sarafu-api dep 2025-04-01 16:25:59 +03:00
Carlosokumu
04880b58a8 fix failing test 2025-04-01 12:49:10 +03:00
Carlosokumu
0458ac9498 fix failing test 2025-04-01 12:38:57 +03:00
Carlosokumu
a7e8c184f5 add some spacing 2025-04-01 11:59:31 +03:00
Carlosokumu
3615348efd add swahili template 2025-04-01 11:57:59 +03:00
Carlosokumu
d0be79d817 set account creation failed flag 2025-04-01 11:30:00 +03:00
alfred-mk
ea0fc4491d removed debug related logs 2025-04-01 11:12:38 +03:00
Carlosokumu
7883063e53 feat: set and reset api call failure flags 2025-03-31 15:42:27 +03:00
Carlosokumu
f562ce8adf check for api call failure when setting the dafault voucher 2025-03-31 15:41:49 +03:00
Carlosokumu
cd2f4328a8 check for api call failure when checking transactions 2025-03-31 15:41:19 +03:00
Carlosokumu
95b9a6e486 catch api call failure when fetching voucher details 2025-03-28 16:09:53 +03:00
Carlosokumu
9674a04cbc add handler to reset api call failure flag,set flag when requesting an alias fails 2025-03-28 15:51:56 +03:00
Carlosokumu
6c46c097fb add explicit api call failure flag reset 2025-03-28 15:47:34 +03:00
Carlosokumu
c814c4ae5c register handler to reset api call failure flag 2025-03-28 15:46:57 +03:00
Carlosokumu
bbecec0310 catch api call error when requesting an alias 2025-03-28 15:46:21 +03:00
Carlosokumu
eaa89c29df Merge branch 'master' into route-api-errors 2025-03-28 15:22:40 +03:00
carlos
2634790118 Merge pull request 'use a different key for the suggested aliases' (#47) from fix-double-alias-request into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #47
2025-03-28 09:35:10 +01:00
Carlosokumu
272a7ac05f chore: remove extra colon 2025-03-28 11:32:24 +03:00
Carlosokumu
39c0d31995 remove verbose logs 2025-03-28 11:26:32 +03:00
Carlosokumu
18acb53ead add alias logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-28 11:08:50 +03:00
Carlosokumu
43d91f84f6 use a different key for the suggested aliases 2025-03-28 10:49:31 +03:00
Carlosokumu
e832f46d22 return to top on retry 2025-03-26 14:40:54 +03:00
Carlosokumu
039117f40e add api call failure catch 2025-03-26 14:40:32 +03:00
Carlosokumu
3532f72fbd remove unneccessary catch 2025-03-26 14:39:37 +03:00
Carlosokumu
04c7e20457 set api call error flag to failing api calls 2025-03-26 14:38:47 +03:00
alfred-mk
0914217769 increase the size limit for the manage_vouchers 2025-03-26 14:33:23 +03:00
alfred-mk
ea117b7222 replace SetDefaultVoucher and CheckVouchers with ManageVouchers 2025-03-26 14:28:43 +03:00
alfred-mk
39e1c84a45 added TestManageVouchers for ManageVouchers 2025-03-26 14:27:17 +03:00
alfred-mk
20ee4dfb24 replace SetDefaultVoucher and CheckVouchers with ManageVouchers 2025-03-26 14:26:31 +03:00
0791eb1f11 ci/cd: build with log warn only
Some checks failed
release / docker (push) Has been cancelled
2025-03-25 09:52:37 +03:00
alfred-mk
8ebd2bbbfa remove alias updates from TestUpdateAllProfileItems
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 20:06:07 +03:00
alfred-mk
06c534cbb1 remove the subprefix db from TestViewVoucher 2025-03-24 20:03:20 +03:00
alfred-mk
b8d53f82bb remove the subprefix db from TestGetVoucherList 2025-03-24 20:01:44 +03:00
alfred-mk
71c01e00cd remove commented out code 2025-03-24 19:58:43 +03:00
alfred-mk
419716a2b4 remove the subprefix db from TestCheckVouchers 2025-03-24 19:57:08 +03:00
alfred-mk
54b2088842 Pass correct arguments in the TestGetVoucherData 2025-03-24 19:53:02 +03:00
alfred-mk
b2208359d6 Add missing param to the GetVoucherData 2025-03-24 19:46:58 +03:00
alfred-mk
0828b1eb10 Increase the limit for the max_amount output 2025-03-24 19:46:58 +03:00
carlos
c22f9edeca Merge pull request 'fix-multiple-alias-requests' (#38) from fix-multiple-alias-requests into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #38
2025-03-24 15:47:26 +01:00
Carlosokumu
c81b17994a remove redundant cast on sanitized input 2025-03-24 16:03:30 +03:00
Carlosokumu
64b42b92ec Merge branch 'master' into fix-multiple-alias-requests 2025-03-24 16:00:20 +03:00
Carlosokumu
493f64157b sanitize alias hint before request 2025-03-24 15:59:13 +03:00
Carlosokumu
f6c9d54a65 register check-account_created handler
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 12:39:03 +03:00
Carlosokumu
74c82de472 add check for if public key exists,then explicitly set flag_account_created
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 12:29:40 +03:00
Carlosokumu
ddb8c6e748 add lowercase balance text translation 2025-03-22 18:39:05 +03:00
Carlosokumu
87ebd0029b chore: show default value when profile info is not set 2025-03-22 18:38:35 +03:00
Carlosokumu
b941cf2562 chore: match profile text prompt 2025-03-22 18:37:27 +03:00
Carlosokumu
1c8bda5ded fix(alias): remove alias requests made when a profile item is edited,show a default value when an alias is not set 2025-03-22 09:49:19 +03:00
alfred-mk
30cb800450 Added log lines for voucherlist
Some checks failed
release / docker (push) Has been cancelled
2025-03-21 13:58:30 +03:00
alfred-mk
680a1e9681 Use userstore for the voucher data instead of subprefixdb
Some checks failed
release / docker (push) Has been cancelled
2025-03-21 13:46:13 +03:00
Carlosokumu
b327b569fb fix failing test 2025-03-21 09:05:51 +03:00
alfred-mk
445ca0d0ff Add a default alias to remove bug in retrieving the data
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 22:34:04 +03:00
alfred-mk
e681c9cfca Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 15:23:36 +03:00
alfred-mk
d504571014 Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 15:07:02 +03:00
alfred-mk
3b16e25ebd Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 14:54:06 +03:00
alfred-mk
5f37856927 Added activeSym logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 14:35:06 +03:00
Carlosokumu
e564f1328b add fetched vouchers log
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 13:48:34 +03:00
374f79388c ci/cd: remove ssh binary from Docker builds
Some checks failed
release / docker (push) Has been cancelled
2025-03-18 17:48:55 +03:00
lash
30644d3535 Merge branch 'lash/more-edbug' 2025-03-15 03:12:05 +00:00
lash
e5e857e3cb Upgrade deps 2025-03-15 03:02:25 +00:00
Carlosokumu
1af826e87f dep: update sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-10 12:41:16 +03:00
Carlosokumu
38ef3b623e dep: update sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-10 11:53:47 +03:00
Carlosokumu
f7e7f7bd1c add for check back,add logs for the alias 2025-03-10 11:51:02 +03:00
Carlosokumu
bd0e7822ed dep: upgrade sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-07 16:13:23 +03:00
Carlosokumu
4dba5f2ab5 dep: upgrade sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-07 09:48:30 +03:00
144398e18b Merge pull request 'ens' (#32) from ens into master
Reviewed-on: #32
Reviewed-by: lash <accounts-grassrootseconomics@holbrook.no>
2025-03-07 06:00:17 +01:00
Carlosokumu
e97d4be296 refactor: break down checkbalance function to avoild code redandancy,remove misplaced flag setting 2025-03-03 12:16:45 +03:00
Carlosokumu
c2a0b05c84 fix: update expected content in checkbalance function 2025-03-03 12:12:46 +03:00
Carlosokumu
20c8af582c switch to use ens api endpoint for the aliases requests 2025-02-28 17:29:18 +03:00
Carlosokumu
101afd5ebd update check balance test 2025-02-27 16:35:41 +03:00
Carlosokumu
830d867ac8 chore: remove alias tag,use lower case b for balance 2025-02-27 16:35:17 +03:00
Carlosokumu
0cbe391209 update test data file to include my alias menu option 2025-02-27 16:00:54 +03:00
Carlosokumu
226d1f5697 fix: update authorize test function 2025-02-27 13:21:42 +03:00
Carlosokumu
3e422f269f feat: show alias if set on main node 2025-02-27 13:14:27 +03:00
Carlosokumu
7a6e5b094f load current alias 2025-02-27 09:42:25 +03:00
Carlosokumu
5ed63cec39 reset invalid PIN flag 2025-02-27 09:41:02 +03:00
Carlosokumu
8f7d5ff66d feat: add request for ens based names from user input 2025-02-26 16:34:00 +03:00
Carlosokumu
f922fb6d43 update authorize_account sink value 2025-02-26 15:48:25 +03:00
Carlosokumu
78af4d225f add alias account template 2025-02-26 15:47:17 +03:00
Carlosokumu
b887c67e5d add node to confirm your alias 2025-02-26 15:14:04 +03:00
Carlosokumu
0816190469 feat: add node to update your alias 2025-02-26 15:08:29 +03:00
Carlosokumu
28e734e0ba feat: add my alias menu option 2025-02-26 15:02:28 +03:00
Carlosokumu
d92dc026f5 check for invalid PIN 2025-02-26 14:51:16 +03:00
Carlosokumu
939df35c8c register new menu handlers 2025-02-26 14:48:19 +03:00
Carlosokumu
c09ce32010 feat: reset invalid pin flag,update template text 2025-02-26 14:46:09 +03:00
Carlosokumu
1f0e7c016e add check for account alias data type 2025-02-26 14:40:17 +03:00
Carlosokumu
a984c9dd06 add invalid and account alias flags 2025-02-26 14:37:54 +03:00
carlos
e2d5546de1 Merge pull request 'fix-pin-reset-bug' (#26) from fix-pin-reset-bug into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #26
2025-02-21 10:31:45 +01:00
alfred-mk
95089875bf remove extra spacing 2025-02-21 12:30:28 +03:00
alfred-mk
4db25055ad Added a fix for invalid PIN in PIN reset 2025-02-21 12:29:28 +03:00
alfred-mk
e8e6f0e371 Added a fix to only hash valid PINs in SaveOthersTemporaryPin 2025-02-21 11:49:51 +03:00
Carlosokumu
91c4967efa check for back 2025-02-21 11:01:42 +03:00
Carlosokumu
7b1824f18c go back if account not unlocked 2025-02-21 11:01:31 +03:00
Carlosokumu
04c3f5ce65 repeat same node on invalid input 2025-02-21 11:01:14 +03:00
Carlosokumu
e646658f40 repeat same node on invalid input 2025-02-21 10:56:12 +03:00
Carlosokumu
c4cab444ad repeat same node on invalid input 2025-02-20 21:26:53 +03:00
Carlosokumu
b5ade9112e catch incorrect pin when resetting for others 2025-02-20 21:21:20 +03:00
Carlosokumu
3b9184e852 check for back 2025-02-20 21:20:41 +03:00
alfred-mk
07b85768d1 Merge branch 'master' into fix-pin-reset-bug 2025-02-20 20:00:21 +03:00
alfred-mk
c9678df152 reset the PIN using the formattedNumber 2025-02-20 19:59:52 +03:00
alfred-mk
c37fee5e54 have the secondarySessionId as a formatted phone number 2025-02-20 19:58:12 +03:00
alfred-mk
98b2a31655 remove extra space 2025-02-20 19:56:48 +03:00
d4fcf40b8d Merge pull request 'remove the sessionId from the ctx' (#25) from remove-session-id-from-ctx into master
Reviewed-on: #25
2025-02-20 17:28:54 +01:00
alfred-mk
83a10efcd9 remove the sessionId from the ctx to prevent double sessionId key (<sessionId>.<sessionId>) 2025-02-20 15:10:18 +03:00
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
alfred-mk
07fd1110ed added documentation lines 2025-02-11 13:22:32 +03:00
alfred-mk
2f1dbb9147 added TestClearTemporaryValue 2025-02-11 13:10:56 +03:00
Carlosokumu
93f1897321 Merge branch 'master' into tests-menu-traversal 2025-02-11 13:07:07 +03:00
alfred-mk
c324e29aea added test case to the TestCheckVouchers 2025-02-11 13:00:23 +03:00
alfred-mk
f91056cca2 Merge branch 'master' into alfred/test-updates 2025-02-11 12:53:41 +03:00
Carlosokumu
7d11377ffd test empty input. 2025-02-11 12:45:52 +03:00
Carlosokumu
9a63234470 set and reset admin flag using persister's state 2025-02-10 15:45:15 +03:00
Carlosokumu
fe74dbb848 add test for menu select voucher 2025-02-10 15:37:05 +03:00
Carlosokumu
278edc7049 test reset other's pin with registred and unregistred phone number 2025-02-10 13:31:18 +03:00
Carlosokumu
3b03d40279 return the persister and flag parser 2025-02-10 12:52:01 +03:00
Carlosokumu
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
alfred-mk
1e8d5b1b83 Remove left over code comment 2025-02-06 16:42:39 +03:00
alfred-mk
628a57ea10 Only clear the temporary data once at main.vis 2025-02-06 16:42:07 +03:00
alfred-mk
a37908323f Remove early LOAD statement 2025-02-06 16:32:03 +03:00
lash
9c27be3a9d Update sarafu-api dep 2025-02-06 12:24:35 +00:00
alfred-mk
1190c5b6f2 Merge branch 'master' into alfred/test-updates 2025-02-06 15:19:40 +03:00
b95452ae5f Merge pull request 'clear-temporary-valua-after-use' (#21) from clear-temporary-valua-after-use into master
Reviewed-on: #21
2025-02-06 13:18:41 +01:00
alfred-mk
14df16098c Updated tests to include the mockState 2025-02-06 15:10:15 +03:00
alfred-mk
1cdd5a37ae Merge branch 'master' into alfred/test-updates 2025-02-06 15:02:18 +03:00
Carlosokumu
6b3b8ffabe add alias request and resolve logs 2025-02-06 14:57:29 +03:00
alfred-mk
6647416115 Return an error if the temporary value is empty 2025-02-06 14:38:11 +03:00
alfred-mk
4155b267ee Clear the temporary value after use 2025-02-06 14:23:42 +03:00
0f2d6def23 Merge pull request 'lash/custom-engin' (#20) from lash/custom-engin into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #20
2025-02-06 11:11:48 +01:00
lash
c13768d782 Remove custom engine 2025-02-05 17:56:08 +00:00
lash
af4b075df3 Add reset on empty to ssh 2025-02-05 17:45:31 +00:00
lash
1d7027905d Use simplified reset on empty input solution 2025-02-05 17:44:29 +00:00
lash
6c77d04284 Merge branch 'lash/async-inputs' into lash/custom-engin 2025-02-05 16:27:10 +00:00
lash
12acd508b1 Allow empty input in async cmd 2025-02-05 16:26:17 +00:00
alfred-mk
f88e253486 Call the engine Reset 2025-02-05 19:16:25 +03:00
alfred-mk
68597ea7cc Return the Sarafu Engine in GetEngine 2025-02-05 19:08:36 +03:00
alfred-mk
3d9eeddab8 Remove the Move to top node on empty input test case 2025-02-05 19:07:35 +03:00
alfred-mk
df58f69032 Remove input length check on menuhandler Init 2025-02-05 19:02:23 +03:00
Carlosokumu
8b999a09a2 add test cases 2025-02-05 18:04:29 +03:00
lash
fdde1bb979 Add missing services import in ssh 2025-02-05 10:28:20 +00:00
lash
23cadc6178 Reinstate loading handlerfuncs in cmd, ssh clients 2025-02-05 10:21:21 +00:00
Carlosokumu
0821241427 repeat same node on invalid option 2025-02-05 10:23:31 +03:00
Carlosokumu
ca71062528 Merge branch 'master' into tests-menu-traversal 2025-02-05 09:11:16 +03:00
1918ea37d5 Merge pull request 'Bug fixes and menu improvement' (#19) from minor-bug-fixes into master
Reviewed-on: #19
Reviewed-by: lash <accounts-grassrootseconomics@holbrook.no>
2025-02-04 14:36:20 +01:00
lash
422b651097 Add missing file 2025-02-04 13:33:44 +00:00
lash
861d04dbfd WIP Implement custom engine 2025-02-04 13:25:17 +00:00
alfred-mk
c78081fb84 added TestInsertOrShift 2025-02-04 11:42:14 +03:00
alfred-mk
ff3c597158 added TestUpdateAllProfileItems 2025-02-04 11:03:23 +03:00
alfred-mk
09c5f3a14c added TestInsertProfileItems 2025-02-04 10:30:39 +03:00
Carlosokumu
f7873bfef7 add mock state to failing tests 2025-02-04 10:16:12 +03:00
Carlosokumu
815e3b2a25 remove unused handler 2025-02-04 09:46:33 +03:00
Carlosokumu
f9a9a9b4a6 preload all common functions 2025-02-04 08:44:10 +03:00
Carlosokumu
04429ab74c fix: wrong pin count by load and reload handlers 2025-02-04 08:43:55 +03:00
Carlosokumu
d3f1a14e71 replace back with retry option 2025-02-04 08:41:55 +03:00
Carlosokumu
5722d4f8dd reset flags on back navigation,process only numeric pin entries 2025-02-04 08:41:06 +03:00
carlos
cad18c9e64 Merge pull request 'use the latest changes from grassrootseconomics/visedriver-africastalking' (#17) from update-dependency into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #17
2025-01-29 09:18:49 +01:00
Carlosokumu
4169419442 add test for reset without privileges 2025-01-28 09:28:40 +03:00
Carlosokumu
bef62b97e7 extract remaining pin attempts 2025-01-27 14:00:42 +03:00
Carlosokumu
56d0baad6e test block account 2025-01-27 14:00:18 +03:00
alfred-mk
5a586eb67a added TestConstructAccountAlias 2025-01-27 13:31:00 +03:00
alfred-mk
6a945f8f20 added TestResetUnregisteredNumber 2025-01-27 12:53:02 +03:00
alfred-mk
39f8c86e8b added TestResetValidPin 2025-01-27 12:50:46 +03:00
alfred-mk
73b501c8aa removed left over commented code 2025-01-27 12:42:48 +03:00
alfred-mk
a6cd4b5fca added TestResetOthersPin 2025-01-27 12:36:04 +03:00
alfred-mk
d47bc6c241 Merge branch 'master' into alfred/test-updates 2025-01-27 12:23:13 +03:00
alfred-mk
dd55906e70 added TestGetCurrentProfileInfo 2025-01-27 11:35:05 +03:00
alfred-mk
6fdf3735d0 added TestCheckBlockedNumPinMisMatch 2025-01-27 10:52:43 +03:00
alfred-mk
b492421851 enhanced the TestSaveOthersTemporaryPin 2025-01-27 10:40:35 +03:00
alfred-mk
128c0162d2 added TestSaveOthersTemporaryPin 2025-01-27 02:13:53 +03:00
alfred-mk
ebe94c705f added TestValidateBlockedNumber 2025-01-27 01:46:14 +03:00
alfred-mk
df0c1b3429 added TestQuitWithHelp and TestShowBlockedAccount 2025-01-27 01:25:01 +03:00
alfred-mk
d66fd894bc added TestMaxAmount 2025-01-27 01:17:44 +03:00
alfred-mk
28185fc2c5 added TestRetrieveBlockedNumber 2025-01-27 01:05:32 +03:00
alfred-mk
64a87231ca removed redundant type from array 2025-01-24 15:43:42 +03:00
alfred-mk
0e480e3d55 enhanced the TestViewTransactionStatement 2025-01-23 16:08:04 +03:00
alfred-mk
ffea1a0b96 added TestViewTransactionStatement 2025-01-23 15:54:50 +03:00
alfred-mk
be5bd16616 added TestGetTransactionsList 2025-01-23 15:06:12 +03:00
alfred-mk
93723616f6 added TestCheckTransactions 2025-01-23 13:42:17 +03:00
alfred-mk
c9257ba0d6 added TestPersistInitialLanguageCode 2025-01-23 11:47:12 +03:00
alfred-mk
caabf4f8af updated the structure of TestPersistLanguageCode 2025-01-23 11:30:25 +03:00
alfred-mk
f884b19012 added TestCheckBlockedStatus 2025-01-23 11:29:57 +03:00
98 changed files with 2620 additions and 705 deletions

View File

@@ -21,8 +21,7 @@ RUN make VISE_PATH=/build/go-vise -B
WORKDIR /build/sarafu-vise
RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM"
RUN go mod download
RUN go build -tags logtrace,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go
RUN go build -tags logtrace,online -o sarafu-ssh -ldflags="-X main.build=${BUILD} -s -w" cmd/ssh/main.go
RUN go build -tags logdebug,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go
FROM debian:bookworm-slim
@@ -37,7 +36,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
WORKDIR /service
COPY --from=build /build/sarafu-vise/sarafu-at .
COPY --from=build /build/sarafu-vise/sarafu-ssh .
COPY --from=build /build/sarafu-vise/LICENSE .
COPY --from=build /build/sarafu-vise/README.md .
COPY --from=build /build/sarafu-vise/services ./services
@@ -45,6 +43,5 @@ COPY --from=build /build/sarafu-vise/.env.example .
RUN mv .env.example .env
EXPOSE 7123
EXPOSE 7122
CMD ["./sarafu-at"]

View File

@@ -44,6 +44,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
@@ -55,6 +56,7 @@ func main() {
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -81,6 +83,7 @@ func main() {
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
ResetOnEmptyInput: true,
}
if engineDebug {
@@ -99,6 +102,11 @@ func main() {
fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err)
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
@@ -112,6 +120,7 @@ func main() {
os.Exit(1)
}
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
if err != nil {
fmt.Fprintf(os.Stderr, "setdatastore: %v\n", err)
os.Exit(1)
@@ -133,6 +142,7 @@ func main() {
rp := &at.ATRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
bsh = bsh.WithEngineFunc(lhs.GetEngine)
sh := at.NewATRequestHandler(bsh)
mux := http.NewServeMux()

View File

@@ -1,12 +1,15 @@
package main
import (
"bufio"
"context"
"flag"
"fmt"
"io"
"os"
"os/signal"
"path"
"strings"
"syscall"
"git.defalsify.org/vise.git/engine"
@@ -53,6 +56,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
@@ -66,6 +70,7 @@ func main() {
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -93,6 +98,7 @@ func main() {
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
ResetOnEmptyInput: true,
}
if engineDebug {
@@ -116,6 +122,12 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
//defer userdataStore.Close(ctx)
dbResource, ok := rs.(*resource.DbResource)
@@ -125,9 +137,9 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
@@ -145,6 +157,8 @@ func main() {
sessionId: sessionId,
}
sh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
sh = sh.WithEngineFunc(lhs.GetEngine)
cfg.SessionId = sessionId
rqs := request.RequestSession{
Ctx: ctx,
@@ -184,11 +198,19 @@ func main() {
os.Exit(1)
}
fmt.Println("")
_, err = fmt.Scanln(&rqs.Input)
in := bufio.NewReader(os.Stdin)
s, err := in.ReadString('\n')
if err != nil {
if err == io.EOF {
logg.DebugCtxf(ctx, "have EOF, bailing")
break
}
logg.ErrorCtxf(ctx, "error in input", "err", err)
fmt.Errorf("error in input: %v", err)
os.Exit(1)
}
rqs.Input = []byte{}
s = strings.TrimSpace(s)
rqs.Input = []byte(s)
}
}

View File

@@ -43,6 +43,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string")
@@ -55,6 +56,7 @@ func main() {
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -82,6 +84,7 @@ func main() {
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
ResetOnEmptyInput: true,
}
if engineDebug {
@@ -102,6 +105,12 @@ func main() {
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
os.Exit(1)
@@ -109,6 +118,7 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
@@ -133,6 +143,7 @@ func main() {
rp := &httprequest.DefaultRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
bsh = bsh.WithEngineFunc(lhs.GetEngine)
sh := httprequest.NewHTTPRequestHandler(bsh)
s := &http.Server{
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),

View File

@@ -36,6 +36,7 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
@@ -46,6 +47,7 @@ func main() {
flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
config.Apply(override)
@@ -62,7 +64,6 @@ func main() {
}
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
ln, err := lang.LanguageFromCode(config.Language())
if err != nil {
@@ -74,11 +75,13 @@ func main() {
pfp := path.Join(scriptDir, "pp.csv")
cfg := engine.Config{
Root: "root",
SessionId: sessionId,
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
Root: "root",
SessionId: sessionId,
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
EngineDebug: engineDebug,
ResetOnEmptyInput: true,
}
menuStorageService := storage.NewMenuStorageService(conns)
@@ -109,6 +112,12 @@ func main() {
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdatastore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
fmt.Fprintf(os.Stderr, "get dbresource error: %v\n", err)
@@ -117,6 +126,7 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdatastore)
lhs.SetLogDb(&logdb)
lhs.SetPersister(pe)
if err != nil {
fmt.Fprintf(os.Stderr, "localhandler service error: %v\n", err)
@@ -124,17 +134,12 @@ func main() {
}
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)
_, err = lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err)
os.Exit(1)
}
en := lhs.GetEngine()
en = en.WithFirst(hl.Init)
if engineDebug {
en = en.WithDebug(nil)
}
en := lhs.GetEngine(cfg, rs, pe)
cint := make(chan os.Signal)
cterm := make(chan os.Signal)

View File

@@ -84,6 +84,7 @@ func main() {
Root: "root",
OutputSize: uint32(size),
FlagCount: uint32(128),
ResetOnEmptyInput: true,
}
if stateDebug {
cfg.StateDebug = true

View File

@@ -42,7 +42,6 @@ func main() {
}
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
pfp := path.Join(scriptDir, "pp.csv")
flagParser, err := application.NewFlagManager(pfp)

8
go.mod
View File

@@ -3,10 +3,10 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise
go 1.23.4
require (
git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa
git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694
github.com/alecthomas/assert/v2 v2.2.2
github.com/gofrs/uuid v4.4.0+incompatible

20
go.sum
View File

@@ -1,15 +1,11 @@
git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 h1:sPcqXQcywxA8W3W+9qQncLPmsrgqTIlec7vmD4/7vyA=
git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 h1:BJHfokTHzrw9QjQ+4s2HmSER0iBPuE7byW5oQC2zLIQ=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa h1:yQLKwby3eD/zNjNw/INU5lGiLuWPEHdsgASwMA4UptE=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 h1:VoBmqsjlRdz+IPbtKsAkc1IrMepjR+QlesZT31Jokrk=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121153115-bfb16bd5a57a h1:jyS1Q8ktEGnH8R5ne/1GN7SyuDPtEGTrGtC8Px3fVJc=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121153115-bfb16bd5a57a/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk=
git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc=
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f h1:OAHCP3YR1C5h1WFnnEnLs5kn6jTxQHQYWYtQaMZJIMY=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -49,9 +49,8 @@ func (eu *EventsUpdater) updateToken(ctx context.Context, identity identity.Iden
// set default token to given symbol.
func (eu *EventsUpdater) updateDefaultToken(ctx context.Context, identity identity.Identity, userStore *store.UserDataStore, activeSym string) error {
pfxDb := toPrefixDb(userStore, identity.SessionId)
// TODO: the activeSym input should instead be newline separated list?
tokenData, err := store.GetVoucherData(ctx, pfxDb, activeSym)
tokenData, err := store.GetVoucherData(ctx, userStore, identity.SessionId, activeSym)
if err != nil {
return err
}

View File

@@ -6,6 +6,7 @@ import (
"git.defalsify.org/vise.git/db"
"git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource"
@@ -13,6 +14,10 @@ import (
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
)
var (
logg = logging.NewVanilla().WithDomain("sarafu-vise.engine")
)
type HandlerService interface {
GetHandler() (*application.MenuHandlers, error)
}
@@ -22,8 +27,10 @@ type LocalHandlerService struct {
DbRs *resource.DbResource
Pe *persist.Persister
UserdataStore *db.Db
LogDb *db.Db
Cfg engine.Config
Rs resource.Resource
first resource.EntryFunc
}
func NewLocalHandlerService(ctx context.Context, fp string, debug bool, dbResource *resource.DbResource, cfg engine.Config, rs resource.Resource) (*LocalHandlerService, error) {
@@ -51,16 +58,19 @@ func (ls *LocalHandlerService) SetDataStore(db *db.Db) {
ls.UserdataStore = db
}
func (ls *LocalHandlerService) SetLogDb(db *db.Db) {
ls.LogDb = db
}
func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) (*application.MenuHandlers, error) {
replaceSeparatorFunc := func(input string) string {
return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator)
}
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, accountService, replaceSeparatorFunc)
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, *ls.LogDb, accountService, replaceSeparatorFunc)
if err != nil {
return nil, err
}
//appHandlers = appHandlers.WithPersister(ls.Pe)
appHandlers.SetPersister(ls.Pe)
ls.DbRs.AddLocalFunc("check_blocked_status", appHandlers.CheckBlockedStatus)
ls.DbRs.AddLocalFunc("set_language", appHandlers.SetLanguage)
@@ -94,23 +104,18 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("verify_yob", appHandlers.VerifyYob)
ls.DbRs.AddLocalFunc("reset_incorrect_date_format", appHandlers.ResetIncorrectYob)
ls.DbRs.AddLocalFunc("initiate_transaction", appHandlers.InitiateTransaction)
ls.DbRs.AddLocalFunc("verify_new_pin", appHandlers.VerifyNewPin)
ls.DbRs.AddLocalFunc("confirm_pin_change", appHandlers.ConfirmPinChange)
ls.DbRs.AddLocalFunc("quit_with_help", appHandlers.QuitWithHelp)
ls.DbRs.AddLocalFunc("fetch_community_balance", appHandlers.FetchCommunityBalance)
ls.DbRs.AddLocalFunc("set_default_voucher", appHandlers.SetDefaultVoucher)
ls.DbRs.AddLocalFunc("check_vouchers", appHandlers.CheckVouchers)
ls.DbRs.AddLocalFunc("manage_vouchers", appHandlers.ManageVouchers)
ls.DbRs.AddLocalFunc("get_vouchers", appHandlers.GetVoucherList)
ls.DbRs.AddLocalFunc("view_voucher", appHandlers.ViewVoucher)
ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher)
ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails)
ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin)
ls.DbRs.AddLocalFunc("check_pin_mismatch", appHandlers.CheckBlockedNumPinMisMatch)
ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber)
ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber)
ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber)
ls.DbRs.AddLocalFunc("reset_others_pin", appHandlers.ResetOthersPin)
ls.DbRs.AddLocalFunc("save_others_temporary_pin", appHandlers.SaveOthersTemporaryPin)
ls.DbRs.AddLocalFunc("get_current_profile_info", appHandlers.GetCurrentProfileInfo)
ls.DbRs.AddLocalFunc("check_transactions", appHandlers.CheckTransactions)
ls.DbRs.AddLocalFunc("get_transactions", appHandlers.GetTransactionsList)
@@ -118,13 +123,27 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("update_all_profile_items", appHandlers.UpdateAllProfileItems)
ls.DbRs.AddLocalFunc("set_back", appHandlers.SetBack)
ls.DbRs.AddLocalFunc("show_blocked_account", appHandlers.ShowBlockedAccount)
ls.DbRs.AddLocalFunc("clear_temporary_value", appHandlers.ClearTemporaryValue)
ls.DbRs.AddLocalFunc("reset_invalid_pin", appHandlers.ResetInvalidPIN)
ls.DbRs.AddLocalFunc("request_custom_alias", appHandlers.RequestCustomAlias)
ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias)
ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias)
ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated)
ls.DbRs.AddLocalFunc("reset_api_call_failure", appHandlers.ResetApiCallFailure)
ls.first = appHandlers.Init
return appHandlers, nil
}
// TODO: enable setting of sessionId on engine init time
func (ls *LocalHandlerService) GetEngine() *engine.DefaultEngine {
en := engine.NewEngine(ls.Cfg, ls.Rs)
en = en.WithPersister(ls.Pe)
func (ls *LocalHandlerService) GetEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine {
en := engine.NewEngine(cfg, rs)
if ls.first != nil {
en = en.WithFirst(ls.first)
}
en = en.WithPersister(pr)
if cfg.EngineDebug {
en = en.WithDebug(nil)
}
return en
}

96
internal/sms/sms.go Normal file
View File

@@ -0,0 +1,96 @@
package sms
import (
"context"
"fmt"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/common/phone"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
var (
logg = logging.NewVanilla().WithDomain("smsservice")
)
type SmsService struct {
Accountservice remote.AccountService
Userdatastore store.UserDataStore
}
// SendUpsellSMS will send an invitation SMS to an unregistered phone number
func (smsservice *SmsService) SendUpsellSMS(ctx context.Context, inviterPhone, inviteePhone string) error {
if !phone.IsValidPhoneNumber(inviterPhone) {
return fmt.Errorf("invalid inviter phone number %v", inviterPhone)
}
if !phone.IsValidPhoneNumber(inviteePhone) {
return fmt.Errorf("Invalid invitee phone number %v", inviteePhone)
}
_, err := smsservice.Accountservice.SendUpsellSMS(ctx, inviterPhone, inviteePhone)
if err != nil {
return fmt.Errorf("Failed to send upsell sms: %v", err)
}
return nil
}
// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset.
func (smsService *SmsService) SendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error {
formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber)
if err != nil {
return fmt.Errorf("failed to format admin phone number: %w", err)
}
formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber)
if err != nil {
return fmt.Errorf("failed to format blocked phone number: %w", err)
}
if !phone.IsValidPhoneNumber(formattedAdminPhone) {
return fmt.Errorf("invalid admin phone number")
}
if !phone.IsValidPhoneNumber(formattedBlockedPhone) {
return fmt.Errorf("invalid blocked phone number")
}
err = smsService.Accountservice.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone)
if err != nil {
return fmt.Errorf("failed to send pin reset sms: %v", err)
}
return nil
}
// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber.
func (smsService *SmsService) SendAddressSMS(ctx context.Context) error {
store := smsService.Userdatastore
sessionId, ok := ctx.Value("SessionId").(string)
if !ok {
return fmt.Errorf("missing session")
}
publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY)
if err != nil {
logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err)
return err
}
originPhone, err := phone.FormatPhoneNumber(sessionId)
if err != nil {
logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId)
return nil
}
if !phone.IsValidPhoneNumber(originPhone) {
logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone)
return fmt.Errorf("invalid origin phone number")
}
err = smsService.Accountservice.SendAddressSMS(ctx, string(publicKey), originPhone)
if err != nil {
logg.DebugCtxf(ctx, "Failed to send address sms", "error", err)
return fmt.Errorf("Failed to send address sms: %v", err)
}
return nil
}

View File

@@ -1,5 +1,67 @@
{
"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",
"steps": [
@@ -9,7 +71,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "5",
@@ -46,7 +108,11 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "2",
@@ -54,7 +120,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 +140,105 @@
}
]
},
{
"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\n7:My Alias\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\n7:My Alias\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\n7:My Alias\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": "{secondary_session_id} will get a PIN reset request.\nPlease enter your PIN to confirm:\n0:Back\n9:Quit"
},
{
"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\n7:My Alias\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",
"steps": [
@@ -83,7 +248,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "3",
@@ -95,7 +260,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",
@@ -103,7 +268,7 @@
},
{
"input": "1234",
"expectedContent": "Balance: {balance}\n\n0:Back\n9:Quit"
"expectedContent": "{balance}\n\n0:Back\n9:Quit"
},
{
"input": "0",
@@ -111,7 +276,7 @@
},
{
"input": "0",
"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\n7:My Alias\n0:Back"
},
{
"input": "0",
@@ -128,7 +293,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "3",
@@ -140,7 +305,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",
@@ -156,7 +321,7 @@
},
{
"input": "0",
"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\n7:My Alias\n0:Back"
},
{
"input": "0",
@@ -173,7 +338,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -230,7 +395,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -267,7 +432,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -277,6 +442,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:"
@@ -304,7 +473,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -341,7 +510,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -378,7 +547,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -415,7 +584,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -427,7 +596,7 @@
},
{
"input": "1234",
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit"
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: Not Provided\n\n0:Back\n9:Quit"
},
{
"input": "0",
@@ -438,6 +607,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\n7:My Alias\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 (
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 = "+254700000000"
)
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 ""
}
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.
func extractSendAmount(response []byte) string {
// 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) {
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
@@ -130,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
@@ -166,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
@@ -208,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
@@ -249,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
@@ -293,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
@@ -344,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 {
@@ -365,9 +415,21 @@ func TestGroups(t *testing.T) {
}
b := w.Bytes()
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)

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -116,7 +116,7 @@
},
{
"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\n7:My Alias\n0:Back"
},
{
"input": "6",

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,5 +1,4 @@
LOAD check_identifier 0
RELOAD check_identifier
MAP check_identifier
MOUT back 0
MOUT quit 9

View File

@@ -1,12 +1,12 @@
LOAD reset_transaction_amount 0
LOAD max_amount 10
LOAD max_amount 40
RELOAD max_amount
MAP max_amount
MOUT back 0
HALT
LOAD validate_amount 64
RELOAD validate_amount
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
CATCH invalid_amount flag_invalid_amount 1
INCMP _ 0
LOAD get_recipient 0

View File

@@ -1 +1 @@
Failed to connect to the custodial service.Please try again.
Failed to connect to the custodial service .Please try again.

View File

@@ -1,5 +1,7 @@
LOAD reset_api_call_failure 6
RELOAD reset_api_call_failure
MOUT retry 1
MOUT quit 9
HALT
INCMP _ 1
INCMP ^ 1
INCMP quit 9

View File

@@ -0,0 +1 @@
Imeshindwa kuunganisha kwenye huduma ya uangalizi. Tafadhali jaribu tena.

View File

@@ -0,0 +1,2 @@
{{.retrieve_blocked_number}} will get a PIN reset request.
Please enter your PIN to confirm:

View File

@@ -0,0 +1,12 @@
LOAD retrieve_blocked_number 0
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
MOUT back 0
MOUT quit 9
LOAD authorize_account 6
HALT
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
INCMP _ 0
INCMP quit 9
INCMP pin_reset_result *

View File

@@ -0,0 +1,2 @@
{{.retrieve_blocked_number}} atapokea ombi la kuweka upya PIN.
Tafadhali weka PIN yako kudhibitisha:

View File

@@ -1,5 +1,6 @@
LOAD check_transactions 0
RELOAD check_transactions
CATCH api_failure flag_api_call_error 1
CATCH no_transfers flag_no_transfers 1
LOAD authorize_account 6
MOUT back 0

View File

@@ -1,6 +1,6 @@
LOAD reset_incorrect 6
LOAD fetch_community_balance 0
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
MAP fetch_community_balance
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0

View File

@@ -1,4 +1,7 @@
LOAD save_temporary_pin 6
MOUT back 0
HALT
INCMP _ 0
LOAD verify_create_pin 8
RELOAD verify_create_pin
CATCH pin_mismatch flag_pin_mismatch 1
INCMP account_creation *

View File

@@ -0,0 +1,2 @@
Your full alias will be: {{.get_suggested_alias}}
Please enter your PIN to confirm:

View File

@@ -0,0 +1,12 @@
LOAD reset_invalid_pin 6
RELOAD reset_invalid_pin
LOAD get_suggested_alias 0
RELOAD get_suggested_alias
MAP get_suggested_alias
MOUT back 0
HALT
INCMP _ 0
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
CATCH invalid_pin flag_invalid_pin 1
CATCH update_alias flag_allow_update 1

View File

@@ -0,0 +1,2 @@
Lakabu yako kamili itakuwa: {{.get_suggested_alias}}
Tafadhali weka PIN yako ili kuthibitisha:

View File

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

View File

@@ -1,14 +0,0 @@
CATCH pin_entry flag_incorrect_pin 1
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
CATCH invalid_others_pin flag_valid_pin 0
CATCH pin_reset_result flag_account_authorized 1
LOAD save_others_temporary_pin 6
RELOAD save_others_temporary_pin
MOUT back 0
HALT
INCMP _ 0
LOAD check_pin_mismatch 0
RELOAD check_pin_mismatch
CATCH others_pin_mismatch flag_pin_mismatch 1
INCMP pin_entry *

View File

@@ -1 +0,0 @@
Tafadhali thibitisha PIN mpya ya: {{.retrieve_blocked_number}}

View File

@@ -1,5 +1,7 @@
CATCH invalid_pin flag_valid_pin 0
MOUT back 0
HALT
INCMP _ 0
INCMP * pin_reset_success
LOAD confirm_pin_change 0
RELOAD confirm_pin_change
CATCH pin_mismatch flag_pin_mismatch 1
INCMP pin_reset_success *

View File

@@ -2,8 +2,8 @@ LOAD create_account 0
CATCH account_creation_failed flag_account_creation_failed 1
MOUT exit 0
HALT
INCMP quit 0
LOAD save_temporary_pin 6
RELOAD save_temporary_pin
CATCH . flag_incorrect_pin 1
INCMP quit 0
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_create_pin *

View File

@@ -1,5 +0,0 @@
MOUT retry 1
MOUT quit 9
HALT
INCMP confirm_create_pin 1
INCMP quit 9

View File

@@ -1,7 +1,10 @@
CATCH no_admin_privilege flag_admin_privilege 0
CATCH no_admin_privilege flag_admin_privilege 0
LOAD reset_account_authorized 0
RELOAD reset_account_authorized
MOUT back 0
HALT
INCMP _ 0
INCMP enter_others_new_pin *
LOAD validate_blocked_number 6
RELOAD validate_blocked_number
CATCH unregistered_number flag_unregistered_number 1
INCMP authorize_reset_others_pin *

View File

@@ -1 +0,0 @@
Please enter new PIN for: {{.retrieve_blocked_number}}

View File

@@ -1,12 +0,0 @@
LOAD validate_blocked_number 6
RELOAD validate_blocked_number
CATCH unregistered_number flag_unregistered_number 1
LOAD retrieve_blocked_number 0
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
MOUT back 0
HALT
LOAD verify_new_pin 6
RELOAD verify_new_pin
INCMP _ 0
INCMP * confirm_others_new_pin

View File

@@ -1 +0,0 @@
Tafadhali weka PIN mpya ya: {{.retrieve_blocked_number}}

View File

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

View File

@@ -1 +0,0 @@
The PIN you have entered is invalid.Please try a 4 digit number instead.

View File

@@ -1,5 +0,0 @@
MOUT retry 1
MOUT quit 9
HALT
INCMP enter_others_new_pin 1
INCMP quit 9

View File

@@ -1 +1 @@
The PIN you entered is invalid.The PIN must be different from your current PIN.For help call +254757628885
The PIN you entered is invalid. The PIN must be a 4 digit number.

View File

@@ -1,3 +1,8 @@
MOUT back 0
LOAD reset_invalid_pin 6
RELOAD reset_invalid_pin
MOUT retry 1
MOUT quit 9
HALT
INCMP _ 0
INCMP _ 1
INCMP quit 9
INCMP . *

View File

@@ -1 +1 @@
PIN mpya na udhibitisho wa PIN mpya hazilingani.Tafadhali jaribu tena.Kwa usaidizi piga simu +254757628885.
PIN uliyoweka si sahihi. PIN lazima iwe nambari 4.

View File

@@ -30,3 +30,7 @@ msgstr "Salio la Kikundi: 0.00"
msgid "Symbol: %s\nBalance: %s"
msgstr "Sarafu: %s\nSalio: %s"
msgid "%s balance: %s\n"
msgstr "%s salio: %s\n"

View File

@@ -1,7 +1,8 @@
LOAD set_default_voucher 8
RELOAD set_default_voucher
LOAD check_vouchers 10
RELOAD check_vouchers
LOAD clear_temporary_value 2
RELOAD clear_temporary_value
LOAD manage_vouchers 160
RELOAD manage_vouchers
CATCH api_failure flag_api_call_error 1
LOAD check_balance 128
RELOAD check_balance
CATCH api_failure flag_api_call_error 1

View File

@@ -1,3 +1,4 @@
LOAD authorize_account 16
LOAD reset_allow_update 0
MOUT profile 1
MOUT change_language 2
@@ -5,13 +6,15 @@ MOUT check_balance 3
MOUT check_statement 4
MOUT pin_options 5
MOUT my_address 6
MOUT my_account_alias 7
MOUT back 0
HALT
INCMP main 0
INCMP ^ 0
INCMP edit_profile 1
INCMP change_language 2
INCMP balances 3
INCMP check_statement 4
INCMP pin_management 5
INCMP address 6
INCMP my_account_alias 7
INCMP . *

View File

@@ -0,0 +1,2 @@
Current alias: {{.get_current_profile_info}}
Enter your preferred alias:

View File

@@ -0,0 +1,9 @@
LOAD get_current_profile_info 0
MAP get_current_profile_info
MOUT back 0
HALT
INCMP _ 0
LOAD request_custom_alias 0
RELOAD request_custom_alias
CATCH api_failure flag_api_call_error 1
INCMP confirm_new_alias *

View File

@@ -0,0 +1 @@
My Alias

View File

@@ -0,0 +1 @@
Lakabu yangu

View File

@@ -0,0 +1,2 @@
Lakabu ya sasa: {{.get_current_profile_info}}
Weka lakabu unalopendelea:

View File

@@ -1,6 +1,6 @@
LOAD reset_incorrect 6
LOAD check_balance 0
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
MAP check_balance
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0

View File

@@ -1,13 +1,6 @@
LOAD authorize_account 12
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
CATCH old_pin flag_allow_update 0
MOUT back 0
HALT
INCMP _ 0
LOAD save_temporary_pin 6
LOAD verify_new_pin 0
RELOAD save_temporary_pin
RELOAD verify_new_pin
INCMP * confirm_pin_change
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_pin_change *

View File

@@ -1,5 +1,5 @@
MOUT quit 9
MOUT back 0
HALT
INCMP pin_management 0
INCMP ^ 0
INCMP quit 9

View File

@@ -1,7 +1,8 @@
LOAD reset_allow_update 0
RELOAD reset_incorrect
MOUT back 0
HALT
RELOAD reset_allow_update
INCMP _ 0
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
CATCH invalid_pin flag_invalid_pin 1
INCMP new_pin *

View File

@@ -1 +0,0 @@
The PIN you have entered is not a match

View File

@@ -1 +0,0 @@
PIN uliyoweka hailingani.Jaribu tena.

View File

@@ -1,8 +1,14 @@
LOAD set_back 6
LOAD authorize_account 16
LOAD reset_allow_update 4
LOAD save_temporary_pin 1
LOAD reset_incorrect 0
LOAD reset_invalid_pin 6
MOUT change_pin 1
MOUT reset_pin 2
MOUT back 0
HALT
INCMP my_account 0
INCMP old_pin 1
INCMP _ 0
INCMP old_pin 1
INCMP enter_other_number 2
INCMP . *

View File

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

View File

@@ -1 +0,0 @@
The PIN is not a match. Try again

View File

@@ -1,6 +0,0 @@
MOUT retry 1
MOUT quit 9
HALT
INCMP confirm_pin_change 1
INCMP quit 9

View File

@@ -1 +0,0 @@
PIN uliyoweka hailingani.Jaribu tena.

View File

@@ -1,8 +1,9 @@
CATCH _ flag_account_authorized 0
LOAD retrieve_blocked_number 0
MAP retrieve_blocked_number
LOAD reset_others_pin 6
MOUT back 0
MOUT quit 9
HALT
INCMP pin_management 0
INCMP quit 9
INCMP ^ 0
INCMP quit 9

View File

@@ -1,8 +1,6 @@
LOAD confirm_pin_change 0
RELOAD confirm_pin_change
CATCH pin_reset_mismatch flag_pin_mismatch 1
MOUT back 0
MOUT quit 9
HALT
INCMP main 0
INCMP ^ 0
INCMP quit 9
INCMP . *

View File

@@ -9,7 +9,7 @@ flag,flag_account_authorized,15,this is set to allow a user access guarded nodes
flag,flag_invalid_recipient,16,this is set when the transaction recipient is invalid
flag,flag_invalid_recipient_with_invite,17,this is set when the transaction recipient is valid but not on the platform
flag,flag_invalid_amount,18,this is set when the given transaction amount is invalid
flag,flag_incorrect_pin,19,this is set when the provided PIN is invalid or does not match the current account's PIN
flag,flag_incorrect_pin,19,this is set when the provided PIN does not match the current account's PIN
flag,flag_valid_pin,20,this is set when the given PIN is valid
flag,flag_allow_update,21,this is set to allow a user to update their profile data
flag,flag_single_edit,22,this is set to allow a user to edit a single profile item such as year of birth
@@ -29,4 +29,6 @@ flag,flag_location_set,35,this is set when the location of the profile is set
flag,flag_offerings_set,36,this is set when the offerings of the profile is set
flag,flag_back_set,37,this is set when it is a back navigation
flag,flag_account_blocked,38,this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded
flag,flag_invalid_pin,39,this is set when the given PIN is invalid(is less than or more than 4 digits)
flag,flag_alias_set,40,this is set when an account alias has been assigned to a user
flag,flag_account_pin_reset,41,this is set on an account when an admin triggers a PIN reset for them
1 flag flag_language_set 8 checks whether the user has set their prefered language
9 flag flag_invalid_recipient 16 this is set when the transaction recipient is invalid
10 flag flag_invalid_recipient_with_invite 17 this is set when the transaction recipient is valid but not on the platform
11 flag flag_invalid_amount 18 this is set when the given transaction amount is invalid
12 flag flag_incorrect_pin 19 this is set when the provided PIN is invalid or does not match the current account's PIN this is set when the provided PIN does not match the current account's PIN
13 flag flag_valid_pin 20 this is set when the given PIN is valid
14 flag flag_allow_update 21 this is set to allow a user to update their profile data
15 flag flag_single_edit 22 this is set to allow a user to edit a single profile item such as year of birth
29 flag flag_offerings_set 36 this is set when the offerings of the profile is set
30 flag flag_back_set 37 this is set when it is a back navigation
31 flag flag_account_blocked 38 this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded
32 flag flag_invalid_pin 39 this is set when the given PIN is invalid(is less than or more than 4 digits)
33 flag flag_alias_set 40 this is set when an account alias has been assigned to a user
34 flag flag_account_pin_reset 41 this is set on an account when an admin triggers a PIN reset for them

View File

@@ -1,12 +1,15 @@
LOAD check_blocked_status 1
RELOAD check_blocked_status
LOAD check_account_created 2
RELOAD check_account_created
CATCH self_reset_pin flag_account_pin_reset 1
CATCH blocked_account flag_account_blocked 1
CATCH select_language flag_language_set 0
CATCH terms flag_account_created 0
CATCH create_pin flag_pin_set 0
LOAD check_account_status 0
RELOAD check_account_status
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
CATCH account_pending flag_account_pending 1
CATCH create_pin flag_pin_set 0
CATCH main flag_account_success 1
HALT

View File

@@ -0,0 +1,2 @@
A PIN reset has been done on your account.
Please enter a new four number PIN:

View File

@@ -0,0 +1,6 @@
LOAD reset_invalid_pin 6
HALT
LOAD save_temporary_pin 1
RELOAD save_temporary_pin
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_pin_change *

View File

@@ -0,0 +1,2 @@
Uwekaji upya wa PIN umefanyika kwenye akaunti yako.
Tafadhali weka PIN mpya ya nambari nne:

View File

@@ -5,6 +5,7 @@ MOUT back 0
HALT
LOAD validate_recipient 50
RELOAD validate_recipient
CATCH api_failure flag_api_call_error 1
CATCH invalid_recipient flag_invalid_recipient 1
CATCH invite_recipient flag_invalid_recipient_with_invite 1
INCMP _ 0

View File

@@ -1,7 +1,8 @@
LOAD reset_unregistered_number 0
RELOAD reset_unregistered_number
MOUT back 0
MOUT retry 1
MOUT quit 9
HALT
INCMP ^ 0
INCMP _ 1
INCMP quit 9
INCMP . *

View File

@@ -0,0 +1 @@
Your alias has been updated successfully

View File

@@ -0,0 +1,7 @@
LOAD confirm_new_alias 0
RELOAD confirm_new_alias
MOUT back 0
MOUT quit 9
HALT
INCMP ^ 0
INCMP quit 9

View File

@@ -0,0 +1 @@
Ombi lako la kubadilisha lakabu limefanikiwa.

View File

@@ -1,5 +1,7 @@
CATCH no_voucher flag_no_active_voucher 1
LOAD get_voucher_details 0
RELOAD get_voucher_details
CATCH api_failure flag_api_call_error 1
MAP get_voucher_details
MOUT back 0
HALT

View File

@@ -14,6 +14,6 @@ import (
func New(ctx context.Context, storageService storage.StorageService) remote.AccountService {
return &httpremote.HTTPAccountService{
SS: storageService,
UseApi: false,
UseApi: true,
}
}

View File

@@ -177,20 +177,14 @@ func (s *SshRunner) GetEngine(sessionId string) (engine.Engine, func(), error) {
return nil, nil, err
}
// TODO: clear up why pointer here and by-value other cmds
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)
if err != nil {
return nil, nil, err
}
en := lhs.GetEngine()
en = en.WithFirst(hl.Init)
if s.Debug {
en = en.WithDebug(nil)
}
// TODO: this is getting very hacky!
accountService := services.New(ctx, menuStorageService)
_, err = lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err)
os.Exit(1)
}
en := lhs.GetEngine(lhs.Cfg, rs, pe)
closer := func() {
err := menuStorageService.Close(ctx)
if err != nil {

View File

@@ -63,6 +63,10 @@ const (
DATA_INITIAL_LANGUAGE_CODE
//Fully qualified account alias string
DATA_ACCOUNT_ALIAS
//currently suggested alias by the api awaiting user's confirmation as accepted account alias
DATA_SUGGESTED_ALIAS
//Key used to store a value of 1 for a user to reset their own PIN once they access the menu.
DATA_SELF_PIN_RESET
)
const (
@@ -130,7 +134,8 @@ func StringToDataTyp(str string) (DataTyp, error) {
return DATA_GENDER, nil
case "DATA_OFFERINGS":
return DATA_OFFERINGS, nil
case "DATA_ACCOUNT_ALIAS":
return DATA_ACCOUNT_ALIAS, nil
default:
return 0, errors.New("invalid DataTyp string")
}

View File

@@ -33,11 +33,14 @@ func (s *SubPrefixDb) toKey(k []byte) []byte {
func (s *SubPrefixDb) Get(ctx context.Context, key []byte) ([]byte, error) {
s.store.SetPrefix(db.DATATYPE_USERDATA)
key = s.toKey(key)
logg.InfoCtxf(ctx, "SubPrefixDb Get log", "key", string(key))
return s.store.Get(ctx, key)
}
func (s *SubPrefixDb) Put(ctx context.Context, key []byte, val []byte) error {
s.store.SetPrefix(db.DATATYPE_USERDATA)
key = s.toKey(key)
logg.InfoCtxf(ctx, "SubPrefixDb Put log", "key", string(key))
return s.store.Put(ctx, key, val)
}

27
store/log_db.go Normal file
View File

@@ -0,0 +1,27 @@
package store
import (
"context"
visedb "git.defalsify.org/vise.git/db"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
type LogDb struct {
visedb.Db
}
func (db *LogDb) WriteLogEntry(ctx context.Context, sessionId string, typ db.DataTyp, v []byte) error {
db.SetPrefix(visedb.DATATYPE_USERDATA)
db.SetSession(sessionId)
k := storedb.ToBytes(typ)
return db.Put(ctx, k, v)
}
func (db *LogDb) ReadLogEntry(ctx context.Context, sessionId string, typ db.DataTyp) ([]byte, error) {
db.SetPrefix(visedb.DATATYPE_USERDATA)
db.SetSession(sessionId)
k := storedb.ToBytes(typ)
return db.Get(ctx, k)
}

View File

@@ -68,7 +68,7 @@ func ScaleDownBalance(balance, decimals string) string {
}
// GetVoucherData retrieves and matches voucher data
func GetVoucherData(ctx context.Context, db storedb.PrefixDb, input string) (*dataserviceapi.TokenHoldings, error) {
func GetVoucherData(ctx context.Context, store DataStore, sessionId string, input string) (*dataserviceapi.TokenHoldings, error) {
keys := []storedb.DataTyp{
storedb.DATA_VOUCHER_SYMBOLS,
storedb.DATA_VOUCHER_BALANCES,
@@ -78,9 +78,9 @@ func GetVoucherData(ctx context.Context, db storedb.PrefixDb, input string) (*da
data := make(map[storedb.DataTyp]string)
for _, key := range keys {
value, err := db.Get(ctx, storedb.ToBytes(key))
value, err := store.ReadEntry(ctx, sessionId, key)
if err != nil {
return nil, fmt.Errorf("failed to get prefix key %x: %v", storedb.ToBytes(key), err)
return nil, fmt.Errorf("failed to get data key %x: %v", key, err)
}
data[key] = string(value)
}

View File

@@ -8,7 +8,6 @@ import (
"github.com/alecthomas/assert/v2"
"github.com/stretchr/testify/require"
visedb "git.defalsify.org/vise.git/db"
memdb "git.defalsify.org/vise.git/db/mem"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
@@ -77,16 +76,8 @@ func TestProcessVouchers(t *testing.T) {
}
func TestGetVoucherData(t *testing.T) {
ctx := context.Background()
db := memdb.NewMemDb()
err := db.Connect(ctx, "")
if err != nil {
t.Fatal(err)
}
prefix := storedb.ToBytes(visedb.DATATYPE_USERDATA)
spdb := storedb.NewSubPrefixDb(db, prefix)
ctx, store := InitializeTestDb(t)
sessionId := "session123"
// Test voucher data
mockData := map[storedb.DataTyp][]byte{
@@ -98,13 +89,13 @@ func TestGetVoucherData(t *testing.T) {
// Put the data
for key, value := range mockData {
err = spdb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value))
err := store.WriteEntry(ctx, sessionId, key, []byte(value))
if err != nil {
t.Fatal(err)
}
}
result, err := GetVoucherData(ctx, spdb, "1")
result, err := GetVoucherData(ctx, store, sessionId, "1")
assert.NoError(t, err)
assert.Equal(t, "SRF", result.TokenSymbol)

View File

@@ -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{
@@ -105,6 +113,12 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) {
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userDataStore, "test-db-logs", "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
fmt.Fprintf(os.Stderr, "dbresource cast error")
@@ -113,6 +127,7 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userDataStore)
lhs.SetLogDb(&logdb)
lhs.SetPersister(pe)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
@@ -137,15 +152,16 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) {
panic("Unknown account service type")
}
hl, err := lhs.GetHandler(testtag.AccountService)
// TODO: triggers withfirst assignment
_, err = lhs.GetHandler(testtag.AccountService)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
en := lhs.GetEngine()
en = en.WithFirst(hl.Init)
en := lhs.GetEngine(lhs.Cfg, rs, pe)
cleanFn := func() {
logdb.Close(ctx)
err := en.Finish(ctx)
if err != nil {
logg.Errorf(err.Error())
@@ -157,5 +173,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
}

View File

@@ -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