Compare commits

...

38 Commits

Author SHA1 Message Date
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
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
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
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
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
8 changed files with 1282 additions and 76 deletions

2
go.mod
View File

@@ -5,7 +5,7 @@ go 1.23.4
require (
git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac
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/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694
github.com/alecthomas/assert/v2 v2.2.2

4
go.sum
View File

@@ -2,8 +2,8 @@ git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac h1:f/E0ZTclVfMEn
git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac/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/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 h1:cbBpm9uNJak58MpFpNXJuvgCmz+A8kquXr9har4expg=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E=

View File

@@ -102,14 +102,12 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService
return h, nil
}
// WithPersister sets persister instance to the handlers.
// func (h *MenuHandlers) WithPersister(pe *persist.Persister) *MenuHandlers {
// SetPersister sets persister instance to the handlers.
func (h *MenuHandlers) SetPersister(pe *persist.Persister) {
if h.pe != nil {
panic("persister already set")
}
h.pe = pe
//return h
}
// Init initializes the handler for a new session.
@@ -488,13 +486,6 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
return res, nil
}
@@ -535,13 +526,6 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
return res, nil
}
@@ -717,12 +701,6 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by
if err != nil {
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
res.FlagSet = append(res.FlagSet, flag_firstname_set)
} else {
if firstNameSet {
@@ -767,12 +745,6 @@ func (h *MenuHandlers) SaveFamilyname(ctx context.Context, sym string, input []b
logg.ErrorCtxf(ctx, "failed to write familyName entry with", "key", storedb.DATA_FAMILY_NAME, "value", temporaryFamilyName, "error", err)
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
res.FlagSet = append(res.FlagSet, flag_familyname_set)
} else {
if familyNameSet {
@@ -847,12 +819,6 @@ func (h *MenuHandlers) SaveYob(ctx context.Context, sym string, input []byte) (r
logg.ErrorCtxf(ctx, "failed to write yob entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", temporaryYob, "error", err)
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
res.FlagSet = append(res.FlagSet, flag_yob_set)
} else {
if yobSet {
@@ -896,12 +862,6 @@ func (h *MenuHandlers) SaveLocation(ctx context.Context, sym string, input []byt
logg.ErrorCtxf(ctx, "failed to write location entry with", "key", storedb.DATA_LOCATION, "value", temporaryLocation, "error", err)
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
res.FlagSet = append(res.FlagSet, flag_location_set)
} else {
if locationSet {
@@ -947,12 +907,6 @@ func (h *MenuHandlers) SaveGender(ctx context.Context, sym string, input []byte)
logg.ErrorCtxf(ctx, "failed to write gender entry with", "key", storedb.DATA_GENDER, "value", gender, "error", err)
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
res.FlagSet = append(res.FlagSet, flag_gender_set)
} else {
if genderSet {
@@ -998,12 +952,6 @@ func (h *MenuHandlers) SaveOfferings(ctx context.Context, sym string, input []by
logg.ErrorCtxf(ctx, "failed to write offerings entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", offerings, "error", err)
return res, err
}
// clear the temporary value as it has been used
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
res.FlagSet = append(res.FlagSet, flag_offerings_set)
} else {
if offeringsSet {
@@ -1684,12 +1632,6 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp
// res.Content = l.Get("Your invitation to %s to join Sarafu Network has been sent.", string(recipient))
res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient))
// clear the temporary value as it has been used
err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
return res, nil
}
@@ -2363,6 +2305,7 @@ func (h *MenuHandlers) ViewTransactionStatement(ctx context.Context, sym string,
return res, nil
}
// persistInitialLanguageCode receives an initial language code and persists it to the store
func (h *MenuHandlers) persistInitialLanguageCode(ctx context.Context, sessionId string, code string) error {
store := h.userdataStore
_, err := store.ReadEntry(ctx, sessionId, storedb.DATA_INITIAL_LANGUAGE_CODE)
@@ -2395,6 +2338,8 @@ func (h *MenuHandlers) persistLanguageCode(ctx context.Context, code string) err
return h.persistInitialLanguageCode(ctx, sessionId, code)
}
// constructAccountAlias retrieves and alias based on the first and family name
// and writes the result in DATA_ACCOUNT_ALIAS
func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error {
var alias string
store := h.userdataStore
@@ -2438,3 +2383,22 @@ func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error {
}
return nil
}
// ClearTemporaryValue empties the DATA_TEMPORARY_VALUE at the main menu to prevent
// previously stored data from being accessed
func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, input []byte) (resource.Result, error) {
var res resource.Result
sessionId, ok := ctx.Value("SessionId").(string)
if !ok {
return res, fmt.Errorf("missing session")
}
userStore := h.userdataStore
// clear the temporary value at the start
err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(""))
if err != nil {
logg.ErrorCtxf(ctx, "failed to clear DATA_TEMPORARY_VALUE entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", "empty", "error", err)
return res, err
}
return res, nil
}

File diff suppressed because it is too large Load Diff

View File

@@ -6,12 +6,11 @@ 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"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
// sarafu_engine "git.grassecon.net/grassrootseconomics/sarafu-vise/engine"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
)
@@ -67,7 +66,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
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)
@@ -125,6 +123,7 @@ 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.first = appHandlers.Init
return appHandlers, nil

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,3 +1,5 @@
LOAD clear_temporary_value 2
RELOAD clear_temporary_value
LOAD set_default_voucher 8
RELOAD set_default_voucher
LOAD check_vouchers 10

View File

@@ -1,4 +1,3 @@
LOAD confirm_pin_change 7
LOAD set_back 6
LOAD authorize_account 5
LOAD reset_allow_update 4