forked from urdt/ussd
Merge pull request 'profile-edit-traverse' (#199) from profile-edit-traverse into master
Reviewed-on: urdt/ussd#199 Reviewed-by: lash <accounts-grassrootseconomics@holbrook.no>
This commit is contained in:
commit
43892f0d8c
@ -121,6 +121,8 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountServiceIn
|
|||||||
ls.DbRs.AddLocalFunc("check_transactions", ussdHandlers.CheckTransactions)
|
ls.DbRs.AddLocalFunc("check_transactions", ussdHandlers.CheckTransactions)
|
||||||
ls.DbRs.AddLocalFunc("get_transactions", ussdHandlers.GetTransactionsList)
|
ls.DbRs.AddLocalFunc("get_transactions", ussdHandlers.GetTransactionsList)
|
||||||
ls.DbRs.AddLocalFunc("view_statement", ussdHandlers.ViewTransactionStatement)
|
ls.DbRs.AddLocalFunc("view_statement", ussdHandlers.ViewTransactionStatement)
|
||||||
|
ls.DbRs.AddLocalFunc("update_all_profile_items", ussdHandlers.UpdateAllProfileItems)
|
||||||
|
ls.DbRs.AddLocalFunc("set_back", ussdHandlers.SetBack)
|
||||||
|
|
||||||
return ussdHandlers, nil
|
return ussdHandlers, nil
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"git.defalsify.org/vise.git/state"
|
"git.defalsify.org/vise.git/state"
|
||||||
"git.grassecon.net/urdt/ussd/common"
|
"git.grassecon.net/urdt/ussd/common"
|
||||||
"git.grassecon.net/urdt/ussd/internal/utils"
|
"git.grassecon.net/urdt/ussd/internal/utils"
|
||||||
|
"git.grassecon.net/urdt/ussd/models"
|
||||||
"git.grassecon.net/urdt/ussd/remote"
|
"git.grassecon.net/urdt/ussd/remote"
|
||||||
"gopkg.in/leonelquinteros/gotext.v1"
|
"gopkg.in/leonelquinteros/gotext.v1"
|
||||||
|
|
||||||
@ -76,6 +77,7 @@ type Handlers struct {
|
|||||||
flagManager *asm.FlagParser
|
flagManager *asm.FlagParser
|
||||||
accountService remote.AccountServiceInterface
|
accountService remote.AccountServiceInterface
|
||||||
prefixDb storage.PrefixDb
|
prefixDb storage.PrefixDb
|
||||||
|
profile *models.Profile
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHandlers(appFlags *asm.FlagParser, userdataStore db.Db, adminstore *utils.AdminStore, accountService remote.AccountServiceInterface) (*Handlers, error) {
|
func NewHandlers(appFlags *asm.FlagParser, userdataStore db.Db, adminstore *utils.AdminStore, accountService remote.AccountServiceInterface) (*Handlers, error) {
|
||||||
@ -96,6 +98,7 @@ func NewHandlers(appFlags *asm.FlagParser, userdataStore db.Db, adminstore *util
|
|||||||
adminstore: adminstore,
|
adminstore: adminstore,
|
||||||
accountService: accountService,
|
accountService: accountService,
|
||||||
prefixDb: prefixDb,
|
prefixDb: prefixDb,
|
||||||
|
profile: &models.Profile{Max: 6},
|
||||||
}
|
}
|
||||||
return h, nil
|
return h, nil
|
||||||
}
|
}
|
||||||
@ -413,7 +416,10 @@ func (h *Handlers) SaveFirstname(ctx context.Context, sym string, input []byte)
|
|||||||
firstName := string(input)
|
firstName := string(input)
|
||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||||
|
flag_firstname_set, _ := h.flagManager.GetFlag("flag_firstname_set")
|
||||||
|
|
||||||
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
||||||
|
firstNameSet := h.st.MatchFlag(flag_firstname_set, true)
|
||||||
if allowUpdate {
|
if allowUpdate {
|
||||||
temporaryFirstName, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
temporaryFirstName, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_FIRST_NAME, []byte(temporaryFirstName))
|
err = store.WriteEntry(ctx, sessionId, common.DATA_FIRST_NAME, []byte(temporaryFirstName))
|
||||||
@ -421,11 +427,16 @@ func (h *Handlers) SaveFirstname(ctx context.Context, sym string, input []byte)
|
|||||||
logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", common.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", common.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_firstname_set)
|
||||||
} else {
|
} else {
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(firstName))
|
if firstNameSet {
|
||||||
if err != nil {
|
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(firstName))
|
||||||
logg.ErrorCtxf(ctx, "failed to write temporaryFirstName entry with", "key", common.DATA_TEMPORARY_VALUE, "value", firstName, "error", err)
|
if err != nil {
|
||||||
return res, err
|
logg.ErrorCtxf(ctx, "failed to write temporaryFirstName entry with", "key", common.DATA_TEMPORARY_VALUE, "value", firstName, "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
h.profile.InsertOrShift(0, firstName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,7 +456,9 @@ func (h *Handlers) SaveFamilyname(ctx context.Context, sym string, input []byte)
|
|||||||
familyName := string(input)
|
familyName := string(input)
|
||||||
|
|
||||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||||
|
flag_familyname_set, _ := h.flagManager.GetFlag("flag_familyname_set")
|
||||||
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
||||||
|
familyNameSet := h.st.MatchFlag(flag_familyname_set, true)
|
||||||
|
|
||||||
if allowUpdate {
|
if allowUpdate {
|
||||||
temporaryFamilyName, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
temporaryFamilyName, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
||||||
@ -454,11 +467,16 @@ func (h *Handlers) SaveFamilyname(ctx context.Context, sym string, input []byte)
|
|||||||
logg.ErrorCtxf(ctx, "failed to write familyName entry with", "key", common.DATA_FAMILY_NAME, "value", temporaryFamilyName, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write familyName entry with", "key", common.DATA_FAMILY_NAME, "value", temporaryFamilyName, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_familyname_set)
|
||||||
} else {
|
} else {
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(familyName))
|
if familyNameSet {
|
||||||
if err != nil {
|
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(familyName))
|
||||||
logg.ErrorCtxf(ctx, "failed to write temporaryFamilyName entry with", "key", common.DATA_TEMPORARY_VALUE, "value", familyName, "error", err)
|
if err != nil {
|
||||||
return res, err
|
logg.ErrorCtxf(ctx, "failed to write temporaryFamilyName entry with", "key", common.DATA_TEMPORARY_VALUE, "value", familyName, "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
h.profile.InsertOrShift(1, familyName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,7 +494,10 @@ func (h *Handlers) SaveYob(ctx context.Context, sym string, input []byte) (resou
|
|||||||
yob := string(input)
|
yob := string(input)
|
||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||||
|
flag_yob_set, _ := h.flagManager.GetFlag("flag_yob_set")
|
||||||
|
|
||||||
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
||||||
|
yobSet := h.st.MatchFlag(flag_yob_set, true)
|
||||||
|
|
||||||
if allowUpdate {
|
if allowUpdate {
|
||||||
temporaryYob, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
temporaryYob, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
||||||
@ -485,11 +506,16 @@ func (h *Handlers) SaveYob(ctx context.Context, sym string, input []byte) (resou
|
|||||||
logg.ErrorCtxf(ctx, "failed to write yob entry with", "key", common.DATA_TEMPORARY_VALUE, "value", temporaryYob, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write yob entry with", "key", common.DATA_TEMPORARY_VALUE, "value", temporaryYob, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_yob_set)
|
||||||
} else {
|
} else {
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(yob))
|
if yobSet {
|
||||||
if err != nil {
|
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(yob))
|
||||||
logg.ErrorCtxf(ctx, "failed to write temporaryYob entry with", "key", common.DATA_TEMPORARY_VALUE, "value", yob, "error", err)
|
if err != nil {
|
||||||
return res, err
|
logg.ErrorCtxf(ctx, "failed to write temporaryYob entry with", "key", common.DATA_TEMPORARY_VALUE, "value", yob, "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
h.profile.InsertOrShift(3, yob)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,7 +534,9 @@ func (h *Handlers) SaveLocation(ctx context.Context, sym string, input []byte) (
|
|||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
|
|
||||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||||
|
flag_location_set, _ := h.flagManager.GetFlag("flag_location_set")
|
||||||
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
||||||
|
locationSet := h.st.MatchFlag(flag_location_set, true)
|
||||||
|
|
||||||
if allowUpdate {
|
if allowUpdate {
|
||||||
temporaryLocation, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
temporaryLocation, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
||||||
@ -517,11 +545,17 @@ func (h *Handlers) SaveLocation(ctx context.Context, sym string, input []byte) (
|
|||||||
logg.ErrorCtxf(ctx, "failed to write location entry with", "key", common.DATA_LOCATION, "value", temporaryLocation, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write location entry with", "key", common.DATA_LOCATION, "value", temporaryLocation, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_location_set)
|
||||||
} else {
|
} else {
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(location))
|
if locationSet {
|
||||||
if err != nil {
|
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(location))
|
||||||
logg.ErrorCtxf(ctx, "failed to write temporaryLocation entry with", "key", common.DATA_TEMPORARY_VALUE, "value", location, "error", err)
|
if err != nil {
|
||||||
return res, err
|
logg.ErrorCtxf(ctx, "failed to write temporaryLocation entry with", "key", common.DATA_TEMPORARY_VALUE, "value", location, "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_location_set)
|
||||||
|
} else {
|
||||||
|
h.profile.InsertOrShift(4, location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,7 +574,10 @@ func (h *Handlers) SaveGender(ctx context.Context, sym string, input []byte) (re
|
|||||||
gender := strings.Split(symbol, "_")[1]
|
gender := strings.Split(symbol, "_")[1]
|
||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||||
|
flag_gender_set, _ := h.flagManager.GetFlag("flag_gender_set")
|
||||||
|
|
||||||
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
||||||
|
genderSet := h.st.MatchFlag(flag_gender_set, true)
|
||||||
|
|
||||||
if allowUpdate {
|
if allowUpdate {
|
||||||
temporaryGender, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
temporaryGender, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
||||||
@ -549,11 +586,16 @@ func (h *Handlers) SaveGender(ctx context.Context, sym string, input []byte) (re
|
|||||||
logg.ErrorCtxf(ctx, "failed to write gender entry with", "key", common.DATA_GENDER, "value", gender, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write gender entry with", "key", common.DATA_GENDER, "value", gender, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_gender_set)
|
||||||
} else {
|
} else {
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(gender))
|
if genderSet {
|
||||||
if err != nil {
|
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(gender))
|
||||||
logg.ErrorCtxf(ctx, "failed to write temporaryGender entry with", "key", common.DATA_TEMPORARY_VALUE, "value", gender, "error", err)
|
if err != nil {
|
||||||
return res, err
|
logg.ErrorCtxf(ctx, "failed to write temporaryGender entry with", "key", common.DATA_TEMPORARY_VALUE, "value", gender, "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
h.profile.InsertOrShift(2, gender)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,7 +615,10 @@ func (h *Handlers) SaveOfferings(ctx context.Context, sym string, input []byte)
|
|||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
|
|
||||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||||
|
flag_offerings_set, _ := h.flagManager.GetFlag("flag_offerings_set")
|
||||||
|
|
||||||
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
allowUpdate := h.st.MatchFlag(flag_allow_update, true)
|
||||||
|
offeringsSet := h.st.MatchFlag(flag_offerings_set, true)
|
||||||
|
|
||||||
if allowUpdate {
|
if allowUpdate {
|
||||||
temporaryOfferings, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
temporaryOfferings, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE)
|
||||||
@ -582,11 +627,16 @@ func (h *Handlers) SaveOfferings(ctx context.Context, sym string, input []byte)
|
|||||||
logg.ErrorCtxf(ctx, "failed to write offerings entry with", "key", common.DATA_TEMPORARY_VALUE, "value", offerings, "error", err)
|
logg.ErrorCtxf(ctx, "failed to write offerings entry with", "key", common.DATA_TEMPORARY_VALUE, "value", offerings, "error", err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_offerings_set)
|
||||||
} else {
|
} else {
|
||||||
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(offerings))
|
if offeringsSet {
|
||||||
if err != nil {
|
err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(offerings))
|
||||||
logg.ErrorCtxf(ctx, "failed to write temporaryOfferings entry with", "key", common.DATA_TEMPORARY_VALUE, "value", offerings, "error", err)
|
if err != nil {
|
||||||
return res, err
|
logg.ErrorCtxf(ctx, "failed to write temporaryOfferings entry with", "key", common.DATA_TEMPORARY_VALUE, "value", offerings, "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
h.profile.InsertOrShift(5, offerings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -679,6 +729,18 @@ func (h *Handlers) ResetIncorrectPin(ctx context.Context, sym string, input []by
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setback sets the flag_back_set flag when the navigation is back
|
||||||
|
func (h *Handlers) SetBack(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
|
var res resource.Result
|
||||||
|
//TODO:
|
||||||
|
//Add check if the navigation is lateral nav instead of checking the input.
|
||||||
|
if string(input) == "0" {
|
||||||
|
flag_back_set, _ := h.flagManager.GetFlag("flag_back_set")
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_back_set)
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
// CheckAccountStatus queries the API using the TrackingId and sets flags
|
// CheckAccountStatus queries the API using the TrackingId and sets flags
|
||||||
// based on the account status
|
// based on the account status
|
||||||
func (h *Handlers) CheckAccountStatus(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
func (h *Handlers) CheckAccountStatus(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
@ -1278,6 +1340,17 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
var res resource.Result
|
var res resource.Result
|
||||||
var profileInfo []byte
|
var profileInfo []byte
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
flag_firstname_set, _ := h.flagManager.GetFlag("flag_firstname_set")
|
||||||
|
flag_familyname_set, _ := h.flagManager.GetFlag("flag_familyname_set")
|
||||||
|
flag_yob_set, _ := h.flagManager.GetFlag("flag_yob_set")
|
||||||
|
flag_gender_set, _ := h.flagManager.GetFlag("flag_gender_set")
|
||||||
|
flag_location_set, _ := h.flagManager.GetFlag("flag_location_set")
|
||||||
|
flag_offerings_set, _ := h.flagManager.GetFlag("flag_offerings_set")
|
||||||
|
flag_back_set, _ := h.flagManager.GetFlag("flag_back_set")
|
||||||
|
|
||||||
|
res.FlagReset = append(res.FlagReset, flag_back_set)
|
||||||
|
|
||||||
sessionId, ok := ctx.Value("SessionId").(string)
|
sessionId, ok := ctx.Value("SessionId").(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return res, fmt.Errorf("missing session")
|
return res, fmt.Errorf("missing session")
|
||||||
@ -1304,6 +1377,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
logg.ErrorCtxf(ctx, "Failed to read first name entry with", "key", "error", common.DATA_FIRST_NAME, err)
|
logg.ErrorCtxf(ctx, "Failed to read first name entry with", "key", "error", common.DATA_FIRST_NAME, err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_firstname_set)
|
||||||
res.Content = string(profileInfo)
|
res.Content = string(profileInfo)
|
||||||
case common.DATA_FAMILY_NAME:
|
case common.DATA_FAMILY_NAME:
|
||||||
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_FAMILY_NAME)
|
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_FAMILY_NAME)
|
||||||
@ -1315,6 +1389,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
logg.ErrorCtxf(ctx, "Failed to read family name entry with", "key", "error", common.DATA_FAMILY_NAME, err)
|
logg.ErrorCtxf(ctx, "Failed to read family name entry with", "key", "error", common.DATA_FAMILY_NAME, err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_familyname_set)
|
||||||
res.Content = string(profileInfo)
|
res.Content = string(profileInfo)
|
||||||
|
|
||||||
case common.DATA_GENDER:
|
case common.DATA_GENDER:
|
||||||
@ -1327,6 +1402,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
logg.ErrorCtxf(ctx, "Failed to read gender entry with", "key", "error", common.DATA_GENDER, err)
|
logg.ErrorCtxf(ctx, "Failed to read gender entry with", "key", "error", common.DATA_GENDER, err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_gender_set)
|
||||||
res.Content = string(profileInfo)
|
res.Content = string(profileInfo)
|
||||||
case common.DATA_YOB:
|
case common.DATA_YOB:
|
||||||
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_YOB)
|
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_YOB)
|
||||||
@ -1338,8 +1414,8 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
logg.ErrorCtxf(ctx, "Failed to read year of birth(yob) entry with", "key", "error", common.DATA_YOB, err)
|
logg.ErrorCtxf(ctx, "Failed to read year of birth(yob) entry with", "key", "error", common.DATA_YOB, err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_yob_set)
|
||||||
res.Content = string(profileInfo)
|
res.Content = string(profileInfo)
|
||||||
|
|
||||||
case common.DATA_LOCATION:
|
case common.DATA_LOCATION:
|
||||||
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_LOCATION)
|
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_LOCATION)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1350,6 +1426,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
logg.ErrorCtxf(ctx, "Failed to read location entry with", "key", "error", common.DATA_LOCATION, err)
|
logg.ErrorCtxf(ctx, "Failed to read location entry with", "key", "error", common.DATA_LOCATION, err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_location_set)
|
||||||
res.Content = string(profileInfo)
|
res.Content = string(profileInfo)
|
||||||
case common.DATA_OFFERINGS:
|
case common.DATA_OFFERINGS:
|
||||||
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_OFFERINGS)
|
profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_OFFERINGS)
|
||||||
@ -1361,6 +1438,7 @@ func (h *Handlers) GetCurrentProfileInfo(ctx context.Context, sym string, input
|
|||||||
logg.ErrorCtxf(ctx, "Failed to read offerings entry with", "key", "error", common.DATA_OFFERINGS, err)
|
logg.ErrorCtxf(ctx, "Failed to read offerings entry with", "key", "error", common.DATA_OFFERINGS, err)
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_offerings_set)
|
||||||
res.Content = string(profileInfo)
|
res.Content = string(profileInfo)
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
@ -1878,3 +1956,53 @@ func (h *Handlers) ViewTransactionStatement(ctx context.Context, sym string, inp
|
|||||||
|
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) insertProfileItems(ctx context.Context, sessionId string, res *resource.Result) error {
|
||||||
|
var err error
|
||||||
|
store := h.userdataStore
|
||||||
|
profileFlagNames := []string{
|
||||||
|
"flag_firstname_set",
|
||||||
|
"flag_familyname_set",
|
||||||
|
"flag_yob_set",
|
||||||
|
"flag_gender_set",
|
||||||
|
"flag_location_set",
|
||||||
|
"flag_offerings_set",
|
||||||
|
}
|
||||||
|
profileDataKeys := []common.DataTyp{
|
||||||
|
common.DATA_FIRST_NAME,
|
||||||
|
common.DATA_FAMILY_NAME,
|
||||||
|
common.DATA_GENDER,
|
||||||
|
common.DATA_YOB,
|
||||||
|
common.DATA_LOCATION,
|
||||||
|
common.DATA_OFFERINGS,
|
||||||
|
}
|
||||||
|
for index, profileItem := range h.profile.ProfileItems {
|
||||||
|
// Ensure the profileItem is not "0"(is set)
|
||||||
|
if profileItem != "0" {
|
||||||
|
err = store.WriteEntry(ctx, sessionId, profileDataKeys[index], []byte(profileItem))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "failed to write profile entry with", "key", profileDataKeys[index], "value", profileItem, "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the flag for the current index
|
||||||
|
flag, _ := h.flagManager.GetFlag(profileFlagNames[index])
|
||||||
|
res.FlagSet = append(res.FlagSet, flag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateAllProfileItems is used to persist all the new profile information and setup the required profile flags
|
||||||
|
func (h *Handlers) UpdateAllProfileItems(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")
|
||||||
|
}
|
||||||
|
err := h.insertProfileItems(ctx, sessionId, &res)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
@ -181,11 +181,14 @@ func TestSaveFirstname(t *testing.T) {
|
|||||||
fm, _ := NewFlagManager(flagsPath)
|
fm, _ := NewFlagManager(flagsPath)
|
||||||
|
|
||||||
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
||||||
|
flag_firstname_set, _ := fm.GetFlag("flag_firstname_set")
|
||||||
|
|
||||||
// Set the flag in the State
|
// Set the flag in the State
|
||||||
mockState := state.NewState(16)
|
mockState := state.NewState(128)
|
||||||
mockState.SetFlag(flag_allow_update)
|
mockState.SetFlag(flag_allow_update)
|
||||||
|
|
||||||
|
expectedResult := resource.Result{}
|
||||||
|
|
||||||
// Define test data
|
// Define test data
|
||||||
firstName := "John"
|
firstName := "John"
|
||||||
|
|
||||||
@ -193,6 +196,8 @@ func TestSaveFirstname(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expectedResult.FlagSet = []uint32{flag_firstname_set}
|
||||||
|
|
||||||
// Create the Handlers instance with the mock store
|
// Create the Handlers instance with the mock store
|
||||||
h := &Handlers{
|
h := &Handlers{
|
||||||
userdataStore: store,
|
userdataStore: store,
|
||||||
@ -205,7 +210,7 @@ func TestSaveFirstname(t *testing.T) {
|
|||||||
|
|
||||||
// Assert results
|
// Assert results
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, resource.Result{}, res)
|
assert.Equal(t, expectedResult, res)
|
||||||
|
|
||||||
// Verify that the DATA_FIRST_NAME entry has been updated with the temporary value
|
// Verify that the DATA_FIRST_NAME entry has been updated with the temporary value
|
||||||
storedFirstName, _ := store.ReadEntry(ctx, sessionId, common.DATA_FIRST_NAME)
|
storedFirstName, _ := store.ReadEntry(ctx, sessionId, common.DATA_FIRST_NAME)
|
||||||
@ -220,11 +225,16 @@ func TestSaveFamilyname(t *testing.T) {
|
|||||||
fm, _ := NewFlagManager(flagsPath)
|
fm, _ := NewFlagManager(flagsPath)
|
||||||
|
|
||||||
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
||||||
|
flag_firstname_set, _ := fm.GetFlag("flag_familyname_set")
|
||||||
|
|
||||||
// Set the flag in the State
|
// Set the flag in the State
|
||||||
mockState := state.NewState(16)
|
mockState := state.NewState(128)
|
||||||
mockState.SetFlag(flag_allow_update)
|
mockState.SetFlag(flag_allow_update)
|
||||||
|
|
||||||
|
expectedResult := resource.Result{}
|
||||||
|
|
||||||
|
expectedResult.FlagSet = []uint32{flag_firstname_set}
|
||||||
|
|
||||||
// Define test data
|
// Define test data
|
||||||
familyName := "Doeee"
|
familyName := "Doeee"
|
||||||
|
|
||||||
@ -244,7 +254,7 @@ func TestSaveFamilyname(t *testing.T) {
|
|||||||
|
|
||||||
// Assert results
|
// Assert results
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, resource.Result{}, res)
|
assert.Equal(t, expectedResult, res)
|
||||||
|
|
||||||
// Verify that the DATA_FAMILY_NAME entry has been updated with the temporary value
|
// Verify that the DATA_FAMILY_NAME entry has been updated with the temporary value
|
||||||
storedFamilyName, _ := store.ReadEntry(ctx, sessionId, common.DATA_FAMILY_NAME)
|
storedFamilyName, _ := store.ReadEntry(ctx, sessionId, common.DATA_FAMILY_NAME)
|
||||||
@ -259,11 +269,14 @@ func TestSaveYoB(t *testing.T) {
|
|||||||
fm, _ := NewFlagManager(flagsPath)
|
fm, _ := NewFlagManager(flagsPath)
|
||||||
|
|
||||||
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
||||||
|
flag_yob_set, _ := fm.GetFlag("flag_yob_set")
|
||||||
|
|
||||||
// Set the flag in the State
|
// Set the flag in the State
|
||||||
mockState := state.NewState(16)
|
mockState := state.NewState(108)
|
||||||
mockState.SetFlag(flag_allow_update)
|
mockState.SetFlag(flag_allow_update)
|
||||||
|
|
||||||
|
expectedResult := resource.Result{}
|
||||||
|
|
||||||
// Define test data
|
// Define test data
|
||||||
yob := "1980"
|
yob := "1980"
|
||||||
|
|
||||||
@ -271,6 +284,8 @@ func TestSaveYoB(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expectedResult.FlagSet = []uint32{flag_yob_set}
|
||||||
|
|
||||||
// Create the Handlers instance with the mock store
|
// Create the Handlers instance with the mock store
|
||||||
h := &Handlers{
|
h := &Handlers{
|
||||||
userdataStore: store,
|
userdataStore: store,
|
||||||
@ -283,7 +298,7 @@ func TestSaveYoB(t *testing.T) {
|
|||||||
|
|
||||||
// Assert results
|
// Assert results
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, resource.Result{}, res)
|
assert.Equal(t, expectedResult, res)
|
||||||
|
|
||||||
// Verify that the DATA_YOB entry has been updated with the temporary value
|
// Verify that the DATA_YOB entry has been updated with the temporary value
|
||||||
storedYob, _ := store.ReadEntry(ctx, sessionId, common.DATA_YOB)
|
storedYob, _ := store.ReadEntry(ctx, sessionId, common.DATA_YOB)
|
||||||
@ -298,11 +313,14 @@ func TestSaveLocation(t *testing.T) {
|
|||||||
fm, _ := NewFlagManager(flagsPath)
|
fm, _ := NewFlagManager(flagsPath)
|
||||||
|
|
||||||
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
||||||
|
flag_location_set, _ := fm.GetFlag("flag_location_set")
|
||||||
|
|
||||||
// Set the flag in the State
|
// Set the flag in the State
|
||||||
mockState := state.NewState(16)
|
mockState := state.NewState(108)
|
||||||
mockState.SetFlag(flag_allow_update)
|
mockState.SetFlag(flag_allow_update)
|
||||||
|
|
||||||
|
expectedResult := resource.Result{}
|
||||||
|
|
||||||
// Define test data
|
// Define test data
|
||||||
location := "Kilifi"
|
location := "Kilifi"
|
||||||
|
|
||||||
@ -310,6 +328,8 @@ func TestSaveLocation(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expectedResult.FlagSet = []uint32{flag_location_set}
|
||||||
|
|
||||||
// Create the Handlers instance with the mock store
|
// Create the Handlers instance with the mock store
|
||||||
h := &Handlers{
|
h := &Handlers{
|
||||||
userdataStore: store,
|
userdataStore: store,
|
||||||
@ -322,7 +342,7 @@ func TestSaveLocation(t *testing.T) {
|
|||||||
|
|
||||||
// Assert results
|
// Assert results
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, resource.Result{}, res)
|
assert.Equal(t, expectedResult, res)
|
||||||
|
|
||||||
// Verify that the DATA_LOCATION entry has been updated with the temporary value
|
// Verify that the DATA_LOCATION entry has been updated with the temporary value
|
||||||
storedLocation, _ := store.ReadEntry(ctx, sessionId, common.DATA_LOCATION)
|
storedLocation, _ := store.ReadEntry(ctx, sessionId, common.DATA_LOCATION)
|
||||||
@ -337,11 +357,14 @@ func TestSaveOfferings(t *testing.T) {
|
|||||||
fm, _ := NewFlagManager(flagsPath)
|
fm, _ := NewFlagManager(flagsPath)
|
||||||
|
|
||||||
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
||||||
|
flag_offerings_set, _ := fm.GetFlag("flag_offerings_set")
|
||||||
|
|
||||||
// Set the flag in the State
|
// Set the flag in the State
|
||||||
mockState := state.NewState(16)
|
mockState := state.NewState(108)
|
||||||
mockState.SetFlag(flag_allow_update)
|
mockState.SetFlag(flag_allow_update)
|
||||||
|
|
||||||
|
expectedResult := resource.Result{}
|
||||||
|
|
||||||
// Define test data
|
// Define test data
|
||||||
offerings := "Bananas"
|
offerings := "Bananas"
|
||||||
|
|
||||||
@ -349,6 +372,8 @@ func TestSaveOfferings(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expectedResult.FlagSet = []uint32{flag_offerings_set}
|
||||||
|
|
||||||
// Create the Handlers instance with the mock store
|
// Create the Handlers instance with the mock store
|
||||||
h := &Handlers{
|
h := &Handlers{
|
||||||
userdataStore: store,
|
userdataStore: store,
|
||||||
@ -361,7 +386,7 @@ func TestSaveOfferings(t *testing.T) {
|
|||||||
|
|
||||||
// Assert results
|
// Assert results
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, resource.Result{}, res)
|
assert.Equal(t, expectedResult, res)
|
||||||
|
|
||||||
// Verify that the DATA_OFFERINGS entry has been updated with the temporary value
|
// Verify that the DATA_OFFERINGS entry has been updated with the temporary value
|
||||||
storedOfferings, _ := store.ReadEntry(ctx, sessionId, common.DATA_OFFERINGS)
|
storedOfferings, _ := store.ReadEntry(ctx, sessionId, common.DATA_OFFERINGS)
|
||||||
@ -376,9 +401,10 @@ func TestSaveGender(t *testing.T) {
|
|||||||
fm, _ := NewFlagManager(flagsPath)
|
fm, _ := NewFlagManager(flagsPath)
|
||||||
|
|
||||||
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
flag_allow_update, _ := fm.GetFlag("flag_allow_update")
|
||||||
|
flag_gender_set, _ := fm.GetFlag("flag_gender_set")
|
||||||
|
|
||||||
// Set the flag in the State
|
// Set the flag in the State
|
||||||
mockState := state.NewState(16)
|
mockState := state.NewState(108)
|
||||||
mockState.SetFlag(flag_allow_update)
|
mockState.SetFlag(flag_allow_update)
|
||||||
|
|
||||||
// Define test cases
|
// Define test cases
|
||||||
@ -422,12 +448,16 @@ func TestSaveGender(t *testing.T) {
|
|||||||
flagManager: fm.parser,
|
flagManager: fm.parser,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expectedResult := resource.Result{}
|
||||||
|
|
||||||
// Call the method
|
// Call the method
|
||||||
res, err := h.SaveGender(ctx, "save_gender", tt.input)
|
res, err := h.SaveGender(ctx, "save_gender", tt.input)
|
||||||
|
|
||||||
|
expectedResult.FlagSet = []uint32{flag_gender_set}
|
||||||
|
|
||||||
// Assert results
|
// Assert results
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, resource.Result{}, res)
|
assert.Equal(t, expectedResult, res)
|
||||||
|
|
||||||
// Verify that the DATA_GENDER entry has been updated with the temporary value
|
// Verify that the DATA_GENDER entry has been updated with the temporary value
|
||||||
storedGender, _ := store.ReadEntry(ctx, sessionId, common.DATA_GENDER)
|
storedGender, _ := store.ReadEntry(ctx, sessionId, common.DATA_GENDER)
|
||||||
|
@ -167,7 +167,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "menu_my_account_edit_firstname",
|
"name": "menu_my_account_edit_all_account_details_starting_from_firstname",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"input": "",
|
"input": "",
|
||||||
@ -187,6 +187,26 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"input": "foo",
|
"input": "foo",
|
||||||
|
"expectedContent": "Enter family name:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "bar",
|
||||||
|
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "Enter your year of birth\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1940",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
"expectedContent": "Please enter your PIN:"
|
"expectedContent": "Please enter your PIN:"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -197,10 +217,6 @@
|
|||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
@ -208,7 +224,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "menu_my_account_edit_familyname",
|
"name": "menu_my_account_edit_familyname_when_all_account__details_have_been_set",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"input": "",
|
"input": "",
|
||||||
@ -238,10 +254,6 @@
|
|||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
@ -250,7 +262,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "menu_my_account_edit_gender",
|
"name": "menu_my_account_edit_gender_when_all_account__details_have_been_set",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"input": "",
|
"input": "",
|
||||||
@ -280,10 +292,6 @@
|
|||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
@ -291,7 +299,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "menu_my_account_edit_yob",
|
"name": "menu_my_account_edit_yob_when_all_account__details_have_been_set",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"input": "",
|
"input": "",
|
||||||
@ -321,10 +329,6 @@
|
|||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
@ -332,7 +336,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "menu_my_account_edit_location",
|
"name": "menu_my_account_edit_location_when_all_account_details_have_been_set",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"input": "",
|
"input": "",
|
||||||
@ -362,10 +366,6 @@
|
|||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
@ -373,7 +373,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "menu_my_account_edit_offerings",
|
"name": "menu_my_account_edit_offerings_when_all_account__details_have_been_set",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"input": "",
|
"input": "",
|
||||||
@ -403,10 +403,6 @@
|
|||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
@ -434,16 +430,12 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"input": "1234",
|
"input": "1234",
|
||||||
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 79\nLocation: Kilifi\nYou provide: Bananas\n\n0:Back"
|
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 84\nLocation: Kilifi\nYou provide: Bananas\n\n0:Back"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"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"
|
"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": "0",
|
|
||||||
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"input": "0",
|
"input": "0",
|
||||||
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
@ -3,6 +3,7 @@ package menutraversaltest
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"flag"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
@ -15,14 +16,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
testData = driver.ReadData()
|
testData = driver.ReadData()
|
||||||
testStore = ".test_state"
|
testStore = ".test_state"
|
||||||
groupTestFile = "group_test.json"
|
sessionID string
|
||||||
sessionID string
|
src = rand.NewSource(42)
|
||||||
src = rand.NewSource(42)
|
g = rand.New(src)
|
||||||
g = rand.New(src)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests")
|
||||||
|
|
||||||
func GenerateSessionId() string {
|
func GenerateSessionId() string {
|
||||||
uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g))
|
uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g))
|
||||||
v, err := uu.NewV4()
|
v, err := uu.NewV4()
|
||||||
@ -337,7 +339,7 @@ func TestMainMenuSend(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGroups(t *testing.T) {
|
func TestGroups(t *testing.T) {
|
||||||
groups, err := driver.LoadTestGroups(groupTestFile)
|
groups, err := driver.LoadTestGroups(*groupTestFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to load test groups: %v", err)
|
log.Fatalf("Failed to load test groups: %v", err)
|
||||||
}
|
}
|
||||||
|
68
menutraversal_test/profile_edit_start_familyname.json
Normal file
68
menutraversal_test/profile_edit_start_familyname.json
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_all_account_details_starting_from_family_name",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "2",
|
||||||
|
"expectedContent": "Enter family name:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "bar",
|
||||||
|
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "Enter your year of birth\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1940",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
61
menutraversal_test/profile_edit_start_firstname.json
Normal file
61
menutraversal_test/profile_edit_start_firstname.json
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_all_account_details_starting_from_firstname",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "Enter your first names:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "foo",
|
||||||
|
"expectedContent": "Enter family name:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "bar",
|
||||||
|
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "Enter your year of birth\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1940",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
55
menutraversal_test/profile_edit_start_gender.json
Normal file
55
menutraversal_test/profile_edit_start_gender.json
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_all_account_details_starting_from_gender",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "Enter your year of birth\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1940",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
46
menutraversal_test/profile_edit_start_location.json
Normal file
46
menutraversal_test/profile_edit_start_location.json
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_all_account_details_starting_from_location",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "5",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
42
menutraversal_test/profile_edit_start_offerings.json
Normal file
42
menutraversal_test/profile_edit_start_offerings.json
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_all_account_details_starting_from_offerings",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "6",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
50
menutraversal_test/profile_edit_start_yob.json
Normal file
50
menutraversal_test/profile_edit_start_yob.json
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_all_account_details_starting_from_yob",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "4",
|
||||||
|
"expectedContent": "Enter your year of birth\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1940",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
70
menutraversal_test/profile_edit_when_adjacent_item_set.json
Normal file
70
menutraversal_test/profile_edit_when_adjacent_item_set.json
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "menu_my_account_edit_familyname_when_adjacent_profile_information_set",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"input": "",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "3",
|
||||||
|
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1",
|
||||||
|
"expectedContent": "Enter your year of birth\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1940",
|
||||||
|
"expectedContent": "Enter your location:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Kilifi",
|
||||||
|
"expectedContent": "Enter the services or goods you offer: \n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "Bananas",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "2",
|
||||||
|
"expectedContent": "Enter family name:\n0:Back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "foo2",
|
||||||
|
"expectedContent": "Please enter your PIN:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "1234",
|
||||||
|
"expectedContent": "Profile updated successfully\n\n0:Back\n9:Quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "0",
|
||||||
|
"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": "0",
|
||||||
|
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
18
models/profile.go
Normal file
18
models/profile.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
type Profile struct {
|
||||||
|
ProfileItems []string
|
||||||
|
Max int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Profile) InsertOrShift(index int, value string) {
|
||||||
|
if index < len(p.ProfileItems) {
|
||||||
|
p.ProfileItems = append(p.ProfileItems[:index], value)
|
||||||
|
} else {
|
||||||
|
for len(p.ProfileItems) < index {
|
||||||
|
p.ProfileItems = append(p.ProfileItems, "0")
|
||||||
|
}
|
||||||
|
p.ProfileItems = append(p.ProfileItems, "0")
|
||||||
|
p.ProfileItems[index] = value
|
||||||
|
}
|
||||||
|
}
|
@ -2,9 +2,17 @@ CATCH incorrect_pin flag_incorrect_pin 1
|
|||||||
CATCH update_familyname flag_allow_update 1
|
CATCH update_familyname flag_allow_update 1
|
||||||
LOAD get_current_profile_info 0
|
LOAD get_current_profile_info 0
|
||||||
RELOAD get_current_profile_info
|
RELOAD get_current_profile_info
|
||||||
|
MAP get_current_profile_info
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
HALT
|
HALT
|
||||||
LOAD save_familyname 0
|
RELOAD set_back
|
||||||
|
CATCH _ flag_back_set 1
|
||||||
|
LOAD save_familyname 64
|
||||||
RELOAD save_familyname
|
RELOAD save_familyname
|
||||||
INCMP _ 0
|
CATCH pin_entry flag_familyname_set 1
|
||||||
INCMP pin_entry *
|
CATCH select_gender flag_gender_set 0
|
||||||
|
CATCH edit_yob flag_yob_set 0
|
||||||
|
CATCH edit_location flag_location_set 0
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_familyname_set 0
|
||||||
|
INCMP select_gender *
|
||||||
|
@ -5,7 +5,14 @@ RELOAD get_current_profile_info
|
|||||||
MAP get_current_profile_info
|
MAP get_current_profile_info
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
HALT
|
HALT
|
||||||
LOAD save_firstname 0
|
RELOAD set_back
|
||||||
|
CATCH _ flag_back_set 1
|
||||||
|
LOAD save_firstname 128
|
||||||
RELOAD save_firstname
|
RELOAD save_firstname
|
||||||
INCMP _ 0
|
CATCH pin_entry flag_firstname_set 1
|
||||||
INCMP pin_entry *
|
CATCH edit_family_name flag_familyname_set 0
|
||||||
|
CATCH edit_gender flag_gender_set 0
|
||||||
|
CATCH edit_yob flag_yob_set 0
|
||||||
|
CATCH edit_location flag_location_set 0
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_firstname_set 0
|
||||||
|
@ -2,9 +2,14 @@ CATCH incorrect_pin flag_incorrect_pin 1
|
|||||||
CATCH update_location flag_allow_update 1
|
CATCH update_location flag_allow_update 1
|
||||||
LOAD get_current_profile_info 0
|
LOAD get_current_profile_info 0
|
||||||
RELOAD get_current_profile_info
|
RELOAD get_current_profile_info
|
||||||
|
LOAD save_location 16
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
HALT
|
HALT
|
||||||
LOAD save_location 0
|
RELOAD set_back
|
||||||
|
CATCH _ flag_back_set 1
|
||||||
RELOAD save_location
|
RELOAD save_location
|
||||||
INCMP _ 0
|
INCMP _ 0
|
||||||
INCMP pin_entry *
|
CATCH pin_entry flag_location_set 1
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_location_set 0
|
||||||
|
INCMP edit_offerings *
|
||||||
|
@ -2,9 +2,13 @@ CATCH incorrect_pin flag_incorrect_pin 1
|
|||||||
CATCH update_offerings flag_allow_update 1
|
CATCH update_offerings flag_allow_update 1
|
||||||
LOAD get_current_profile_info 0
|
LOAD get_current_profile_info 0
|
||||||
RELOAD get_current_profile_info
|
RELOAD get_current_profile_info
|
||||||
LOAD save_offerings 0
|
LOAD save_offerings 8
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
HALT
|
HALT
|
||||||
|
RELOAD set_back
|
||||||
|
CATCH _ flag_back_set 1
|
||||||
RELOAD save_offerings
|
RELOAD save_offerings
|
||||||
INCMP _ 0
|
INCMP _ 0
|
||||||
INCMP pin_entry *
|
CATCH pin_entry flag_offerings_set 1
|
||||||
|
CATCH pin_entry flag_offerings_set 0
|
||||||
|
INCMP update_profile_items *
|
||||||
|
@ -11,7 +11,8 @@ MOUT edit_offerings 6
|
|||||||
MOUT view 7
|
MOUT view 7
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
HALT
|
HALT
|
||||||
INCMP my_account 0
|
LOAD set_back 6
|
||||||
|
INCMP ^ 0
|
||||||
INCMP edit_first_name 1
|
INCMP edit_first_name 1
|
||||||
INCMP edit_family_name 2
|
INCMP edit_family_name 2
|
||||||
INCMP select_gender 3
|
INCMP select_gender 3
|
||||||
|
@ -5,10 +5,15 @@ RELOAD get_current_profile_info
|
|||||||
MAP get_current_profile_info
|
MAP get_current_profile_info
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
HALT
|
HALT
|
||||||
|
RELOAD set_back
|
||||||
|
CATCH _ flag_back_set 1
|
||||||
LOAD verify_yob 6
|
LOAD verify_yob 6
|
||||||
RELOAD verify_yob
|
RELOAD verify_yob
|
||||||
CATCH incorrect_date_format flag_incorrect_date_format 1
|
CATCH incorrect_date_format flag_incorrect_date_format 1
|
||||||
LOAD save_yob 0
|
LOAD save_yob 32
|
||||||
RELOAD save_yob
|
RELOAD save_yob
|
||||||
INCMP _ 0
|
CATCH pin_entry flag_yob_set 1
|
||||||
INCMP pin_entry *
|
CATCH edit_location flag_location_set 0
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_yob_set 0
|
||||||
|
INCMP edit_location *
|
||||||
|
@ -21,3 +21,10 @@ flag,flag_admin_privilege,27,this is set when a user has admin privileges.
|
|||||||
flag,flag_unregistered_number,28,this is set when an unregistered phonenumber tries to perform an action
|
flag,flag_unregistered_number,28,this is set when an unregistered phonenumber tries to perform an action
|
||||||
flag,flag_no_transfers,29,this is set when a user does not have any transactions
|
flag,flag_no_transfers,29,this is set when a user does not have any transactions
|
||||||
flag,flag_incorrect_statement,30,this is set when the selected statement is invalid
|
flag,flag_incorrect_statement,30,this is set when the selected statement is invalid
|
||||||
|
flag,flag_firstname_set,31,this is set when the first name of the profile is set
|
||||||
|
flag,flag_familyname_set,32,this is set when the family name of the profile is set
|
||||||
|
flag,flag_yob_set,33,this is set when the yob of the profile is set
|
||||||
|
flag,flag_gender_set,34,this is set when the gender of the profile is set
|
||||||
|
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
|
||||||
|
|
@ -1,3 +1,5 @@
|
|||||||
|
LOAD update_all_profile_items 0
|
||||||
|
RELOAD update_all_profile_items
|
||||||
MOUT back 0
|
MOUT back 0
|
||||||
MOUT quit 9
|
MOUT quit 9
|
||||||
HALT
|
HALT
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
LOAD save_gender 0
|
LOAD save_gender 32
|
||||||
|
RELOAD save_gender
|
||||||
CATCH incorrect_pin flag_incorrect_pin 1
|
CATCH incorrect_pin flag_incorrect_pin 1
|
||||||
CATCH update_gender flag_allow_update 1
|
CATCH update_gender flag_allow_update 1
|
||||||
MOVE pin_entry
|
CATCH pin_entry flag_gender_set 1
|
||||||
|
CATCH edit_yob flag_yob_set 0
|
||||||
|
CATCH edit_location flag_location_set 0
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_gender_set 0
|
||||||
|
MOVE edit_yob
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
LOAD save_gender 0
|
LOAD save_gender 16
|
||||||
|
RELOAD save_gender
|
||||||
CATCH incorrect_pin flag_incorrect_pin 1
|
CATCH incorrect_pin flag_incorrect_pin 1
|
||||||
CATCH update_gender flag_allow_update 1
|
CATCH update_gender flag_allow_update 1
|
||||||
MOVE pin_entry
|
CATCH pin_entry flag_gender_set 1
|
||||||
|
CATCH edit_yob flag_yob_set 0
|
||||||
|
CATCH edit_location flag_location_set 0
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_gender_set 0
|
||||||
|
MOVE edit_yob
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
LOAD save_gender 0
|
LOAD save_gender 8
|
||||||
|
RELOAD save_gender
|
||||||
CATCH incorrect_pin flag_incorrect_pin 1
|
CATCH incorrect_pin flag_incorrect_pin 1
|
||||||
CATCH update_gender flag_allow_update 1
|
CATCH update_gender flag_allow_update 1
|
||||||
MOVE pin_entry
|
CATCH pin_entry flag_gender_set 1
|
||||||
|
CATCH edit_yob flag_yob_set 0
|
||||||
|
CATCH edit_location flag_location_set 0
|
||||||
|
CATCH edit_offerings flag_offerings_set 0
|
||||||
|
CATCH pin_entry flag_gender_set 0
|
||||||
|
MOVE edit_yob
|
||||||
|
3
services/registration/update_profile_items.vis
Normal file
3
services/registration/update_profile_items.vis
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
CATCH incorrect_pin flag_incorrect_pin 1
|
||||||
|
CATCH profile_update_success flag_allow_update 1
|
||||||
|
MOVE pin_entry
|
Loading…
Reference in New Issue
Block a user