From f660f6c19aa91e50ef4d1753a454541ff39dec2c Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 9 Jan 2025 13:04:11 +0300 Subject: [PATCH 1/3] add key to hold selected langauge code --- common/db.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/db.go b/common/db.go index 5e2fc4c..2271716 100644 --- a/common/db.go +++ b/common/db.go @@ -57,6 +57,8 @@ const ( DATA_ACTIVE_ADDRESS //Holds count of the number of incorrect PIN attempts DATA_INCORRECT_PIN_ATTEMPTS + //ISO 639 code for the selected language. + DATA_SELECTED_LANGUAGE_CODE ) const ( From 73eb7654085ef5edb326dd18e6e7b9a18d43b5a3 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 9 Jan 2025 13:14:46 +0300 Subject: [PATCH 2/3] persist selected language code --- internal/handlers/ussd/menuhandler.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/internal/handlers/ussd/menuhandler.go b/internal/handlers/ussd/menuhandler.go index 607b812..4b6a713 100644 --- a/internal/handlers/ussd/menuhandler.go +++ b/internal/handlers/ussd/menuhandler.go @@ -161,9 +161,12 @@ func (h *Handlers) SetLanguage(ctx context.Context, sym string, input []byte) (r //Fallback to english instead? code = "eng" } - res.FlagSet = append(res.FlagSet, state.FLAG_LANG) + err := h.persistLanguageCode(ctx, code) + if err != nil { + return res, err + } res.Content = code - + res.FlagSet = append(res.FlagSet, state.FLAG_LANG) languageSetFlag, err := h.flagManager.GetFlag("flag_language_set") if err != nil { logg.ErrorCtxf(ctx, "Error setting the languageSetFlag", "error", err) @@ -2173,3 +2176,18 @@ func (h *Handlers) resetIncorrectPINAttempts(ctx context.Context, sessionId stri } return nil } + +// persistLanguageCode persists the selected ISO 639 language code +func (h *Handlers) persistLanguageCode(ctx context.Context, code string) error { + store := h.userdataStore + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return fmt.Errorf("missing session") + } + err := store.WriteEntry(ctx, sessionId, common.DATA_SELECTED_LANGUAGE_CODE, []byte(code)) + if err != nil { + logg.ErrorCtxf(ctx, "failed to persist language code", "key", common.DATA_SELECTED_LANGUAGE_CODE, "value", code, "error", err) + return err + } + return nil +} From 3747f87a7ce18c8ccf53f21ef723ffce1e7f73fc Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 9 Jan 2025 15:11:29 +0300 Subject: [PATCH 3/3] test language code saving --- internal/handlers/ussd/menuhandler_test.go | 50 ++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/internal/handlers/ussd/menuhandler_test.go b/internal/handlers/ussd/menuhandler_test.go index af1380d..29f6948 100644 --- a/internal/handlers/ussd/menuhandler_test.go +++ b/internal/handlers/ussd/menuhandler_test.go @@ -775,6 +775,11 @@ func TestSetLanguage(t *testing.T) { log.Fatal(err) } + sessionId := "session123" + ctx, store := InitializeTestStore(t) + + ctx = context.WithValue(ctx, "SessionId", sessionId) + // Define test cases tests := []struct { name string @@ -807,12 +812,13 @@ func TestSetLanguage(t *testing.T) { // Create the Handlers instance with the mock flag manager h := &Handlers{ - flagManager: fm.parser, - st: mockState, + flagManager: fm.parser, + userdataStore: store, + st: mockState, } // Call the method - res, err := h.SetLanguage(context.Background(), "set_language", nil) + res, err := h.SetLanguage(ctx, "set_language", nil) if err != nil { t.Error(err) } @@ -2285,3 +2291,41 @@ func TestResetIncorrectPINAttempts(t *testing.T) { assert.Equal(t, "0", string(incorrectAttempts)) } + +func TestPersistLanguageCode(t *testing.T) { + ctx, store := InitializeTestStore(t) + + sessionId := "session123" + ctx = context.WithValue(ctx, "SessionId", sessionId) + + h := &Handlers{ + userdataStore: store, + } + tests := []struct { + name string + code string + expectedLanguageCode string + }{ + { + name: "Set Default Language (English)", + code: "eng", + expectedLanguageCode: "eng", + }, + { + name: "Set Swahili Language", + code: "swa", + expectedLanguageCode: "swa", + }, + } + + for _, test := range tests { + err := h.persistLanguageCode(ctx, test.code) + if err != nil { + t.Logf(err.Error()) + } + code, err := store.ReadEntry(ctx, sessionId, common.DATA_SELECTED_LANGUAGE_CODE) + + assert.Equal(t, test.expectedLanguageCode, string(code)) + } + +}