forked from grassrootseconomics/visedriver
		
	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("get_transactions", ussdHandlers.GetTransactionsList) | ||||
| 	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 | ||||
| } | ||||
|  | ||||
| @ -20,6 +20,7 @@ import ( | ||||
| 	"git.defalsify.org/vise.git/state" | ||||
| 	"git.grassecon.net/urdt/ussd/common" | ||||
| 	"git.grassecon.net/urdt/ussd/internal/utils" | ||||
| 	"git.grassecon.net/urdt/ussd/models" | ||||
| 	"git.grassecon.net/urdt/ussd/remote" | ||||
| 	"gopkg.in/leonelquinteros/gotext.v1" | ||||
| 
 | ||||
| @ -76,6 +77,7 @@ type Handlers struct { | ||||
| 	flagManager    *asm.FlagParser | ||||
| 	accountService remote.AccountServiceInterface | ||||
| 	prefixDb       storage.PrefixDb | ||||
| 	profile        *models.Profile | ||||
| } | ||||
| 
 | ||||
| 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, | ||||
| 		accountService: accountService, | ||||
| 		prefixDb:       prefixDb, | ||||
| 		profile:        &models.Profile{Max: 6}, | ||||
| 	} | ||||
| 	return h, nil | ||||
| } | ||||
| @ -413,7 +416,10 @@ func (h *Handlers) SaveFirstname(ctx context.Context, sym string, input []byte) | ||||
| 	firstName := string(input) | ||||
| 	store := h.userdataStore | ||||
| 	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) | ||||
| 	firstNameSet := h.st.MatchFlag(flag_firstname_set, true) | ||||
| 	if allowUpdate { | ||||
| 		temporaryFirstName, _ := store.ReadEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE) | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_firstname_set) | ||||
| 	} else { | ||||
| 		err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(firstName)) | ||||
| 		if err != nil { | ||||
| 			logg.ErrorCtxf(ctx, "failed to write temporaryFirstName entry with", "key", common.DATA_TEMPORARY_VALUE, "value", firstName, "error", err) | ||||
| 			return res, err | ||||
| 		if firstNameSet { | ||||
| 			err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(firstName)) | ||||
| 			if err != nil { | ||||
| 				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) | ||||
| 
 | ||||
| 	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) | ||||
| 	familyNameSet := h.st.MatchFlag(flag_familyname_set, true) | ||||
| 
 | ||||
| 	if allowUpdate { | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_familyname_set) | ||||
| 	} else { | ||||
| 		err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(familyName)) | ||||
| 		if err != nil { | ||||
| 			logg.ErrorCtxf(ctx, "failed to write temporaryFamilyName entry with", "key", common.DATA_TEMPORARY_VALUE, "value", familyName, "error", err) | ||||
| 			return res, err | ||||
| 		if familyNameSet { | ||||
| 			err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(familyName)) | ||||
| 			if err != nil { | ||||
| 				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) | ||||
| 	store := h.userdataStore | ||||
| 	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) | ||||
| 	yobSet := h.st.MatchFlag(flag_yob_set, true) | ||||
| 
 | ||||
| 	if allowUpdate { | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_yob_set) | ||||
| 	} else { | ||||
| 		err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(yob)) | ||||
| 		if err != nil { | ||||
| 			logg.ErrorCtxf(ctx, "failed to write temporaryYob entry with", "key", common.DATA_TEMPORARY_VALUE, "value", yob, "error", err) | ||||
| 			return res, err | ||||
| 		if yobSet { | ||||
| 			err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(yob)) | ||||
| 			if err != nil { | ||||
| 				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 | ||||
| 
 | ||||
| 	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) | ||||
| 	locationSet := h.st.MatchFlag(flag_location_set, true) | ||||
| 
 | ||||
| 	if allowUpdate { | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_location_set) | ||||
| 	} else { | ||||
| 		err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(location)) | ||||
| 		if err != nil { | ||||
| 			logg.ErrorCtxf(ctx, "failed to write temporaryLocation entry with", "key", common.DATA_TEMPORARY_VALUE, "value", location, "error", err) | ||||
| 			return res, err | ||||
| 		if locationSet { | ||||
| 			err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(location)) | ||||
| 			if err != nil { | ||||
| 				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] | ||||
| 	store := h.userdataStore | ||||
| 	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) | ||||
| 	genderSet := h.st.MatchFlag(flag_gender_set, true) | ||||
| 
 | ||||
| 	if allowUpdate { | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_gender_set) | ||||
| 	} else { | ||||
| 		err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(gender)) | ||||
| 		if err != nil { | ||||
| 			logg.ErrorCtxf(ctx, "failed to write temporaryGender entry with", "key", common.DATA_TEMPORARY_VALUE, "value", gender, "error", err) | ||||
| 			return res, err | ||||
| 		if genderSet { | ||||
| 			err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(gender)) | ||||
| 			if err != nil { | ||||
| 				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 | ||||
| 
 | ||||
| 	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) | ||||
| 	offeringsSet := h.st.MatchFlag(flag_offerings_set, true) | ||||
| 
 | ||||
| 	if allowUpdate { | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_offerings_set) | ||||
| 	} else { | ||||
| 		err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(offerings)) | ||||
| 		if err != nil { | ||||
| 			logg.ErrorCtxf(ctx, "failed to write temporaryOfferings entry with", "key", common.DATA_TEMPORARY_VALUE, "value", offerings, "error", err) | ||||
| 			return res, err | ||||
| 		if offeringsSet { | ||||
| 			err = store.WriteEntry(ctx, sessionId, common.DATA_TEMPORARY_VALUE, []byte(offerings)) | ||||
| 			if err != nil { | ||||
| 				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 | ||||
| } | ||||
| 
 | ||||
| // 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
 | ||||
| // based on the account status
 | ||||
| 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 profileInfo []byte | ||||
| 	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) | ||||
| 	if !ok { | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_firstname_set) | ||||
| 		res.Content = string(profileInfo) | ||||
| 	case 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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_familyname_set) | ||||
| 		res.Content = string(profileInfo) | ||||
| 
 | ||||
| 	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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_gender_set) | ||||
| 		res.Content = string(profileInfo) | ||||
| 	case 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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_yob_set) | ||||
| 		res.Content = string(profileInfo) | ||||
| 
 | ||||
| 	case common.DATA_LOCATION: | ||||
| 		profileInfo, err = store.ReadEntry(ctx, sessionId, common.DATA_LOCATION) | ||||
| 		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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_location_set) | ||||
| 		res.Content = string(profileInfo) | ||||
| 	case 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) | ||||
| 			return res, err | ||||
| 		} | ||||
| 		res.FlagSet = append(res.FlagSet, flag_offerings_set) | ||||
| 		res.Content = string(profileInfo) | ||||
| 	default: | ||||
| 		break | ||||
| @ -1878,3 +1956,53 @@ func (h *Handlers) ViewTransactionStatement(ctx context.Context, sym string, inp | ||||
| 
 | ||||
| 	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) | ||||
| 
 | ||||
| 	flag_allow_update, _ := fm.GetFlag("flag_allow_update") | ||||
| 	flag_firstname_set, _ := fm.GetFlag("flag_firstname_set") | ||||
| 
 | ||||
| 	// Set the flag in the State
 | ||||
| 	mockState := state.NewState(16) | ||||
| 	mockState := state.NewState(128) | ||||
| 	mockState.SetFlag(flag_allow_update) | ||||
| 
 | ||||
| 	expectedResult := resource.Result{} | ||||
| 
 | ||||
| 	// Define test data
 | ||||
| 	firstName := "John" | ||||
| 
 | ||||
| @ -193,6 +196,8 @@ func TestSaveFirstname(t *testing.T) { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	expectedResult.FlagSet = []uint32{flag_firstname_set} | ||||
| 
 | ||||
| 	// Create the Handlers instance with the mock store
 | ||||
| 	h := &Handlers{ | ||||
| 		userdataStore: store, | ||||
| @ -205,7 +210,7 @@ func TestSaveFirstname(t *testing.T) { | ||||
| 
 | ||||
| 	// Assert results
 | ||||
| 	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
 | ||||
| 	storedFirstName, _ := store.ReadEntry(ctx, sessionId, common.DATA_FIRST_NAME) | ||||
| @ -220,11 +225,16 @@ func TestSaveFamilyname(t *testing.T) { | ||||
| 	fm, _ := NewFlagManager(flagsPath) | ||||
| 
 | ||||
| 	flag_allow_update, _ := fm.GetFlag("flag_allow_update") | ||||
| 	flag_firstname_set, _ := fm.GetFlag("flag_familyname_set") | ||||
| 
 | ||||
| 	// Set the flag in the State
 | ||||
| 	mockState := state.NewState(16) | ||||
| 	mockState := state.NewState(128) | ||||
| 	mockState.SetFlag(flag_allow_update) | ||||
| 
 | ||||
| 	expectedResult := resource.Result{} | ||||
| 
 | ||||
| 	expectedResult.FlagSet = []uint32{flag_firstname_set} | ||||
| 
 | ||||
| 	// Define test data
 | ||||
| 	familyName := "Doeee" | ||||
| 
 | ||||
| @ -244,7 +254,7 @@ func TestSaveFamilyname(t *testing.T) { | ||||
| 
 | ||||
| 	// Assert results
 | ||||
| 	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
 | ||||
| 	storedFamilyName, _ := store.ReadEntry(ctx, sessionId, common.DATA_FAMILY_NAME) | ||||
| @ -259,11 +269,14 @@ func TestSaveYoB(t *testing.T) { | ||||
| 	fm, _ := NewFlagManager(flagsPath) | ||||
| 
 | ||||
| 	flag_allow_update, _ := fm.GetFlag("flag_allow_update") | ||||
| 	flag_yob_set, _ := fm.GetFlag("flag_yob_set") | ||||
| 
 | ||||
| 	// Set the flag in the State
 | ||||
| 	mockState := state.NewState(16) | ||||
| 	mockState := state.NewState(108) | ||||
| 	mockState.SetFlag(flag_allow_update) | ||||
| 
 | ||||
| 	expectedResult := resource.Result{} | ||||
| 
 | ||||
| 	// Define test data
 | ||||
| 	yob := "1980" | ||||
| 
 | ||||
| @ -271,6 +284,8 @@ func TestSaveYoB(t *testing.T) { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	expectedResult.FlagSet = []uint32{flag_yob_set} | ||||
| 
 | ||||
| 	// Create the Handlers instance with the mock store
 | ||||
| 	h := &Handlers{ | ||||
| 		userdataStore: store, | ||||
| @ -283,7 +298,7 @@ func TestSaveYoB(t *testing.T) { | ||||
| 
 | ||||
| 	// Assert results
 | ||||
| 	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
 | ||||
| 	storedYob, _ := store.ReadEntry(ctx, sessionId, common.DATA_YOB) | ||||
| @ -298,11 +313,14 @@ func TestSaveLocation(t *testing.T) { | ||||
| 	fm, _ := NewFlagManager(flagsPath) | ||||
| 
 | ||||
| 	flag_allow_update, _ := fm.GetFlag("flag_allow_update") | ||||
| 	flag_location_set, _ := fm.GetFlag("flag_location_set") | ||||
| 
 | ||||
| 	// Set the flag in the State
 | ||||
| 	mockState := state.NewState(16) | ||||
| 	mockState := state.NewState(108) | ||||
| 	mockState.SetFlag(flag_allow_update) | ||||
| 
 | ||||
| 	expectedResult := resource.Result{} | ||||
| 
 | ||||
| 	// Define test data
 | ||||
| 	location := "Kilifi" | ||||
| 
 | ||||
| @ -310,6 +328,8 @@ func TestSaveLocation(t *testing.T) { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	expectedResult.FlagSet = []uint32{flag_location_set} | ||||
| 
 | ||||
| 	// Create the Handlers instance with the mock store
 | ||||
| 	h := &Handlers{ | ||||
| 		userdataStore: store, | ||||
| @ -322,7 +342,7 @@ func TestSaveLocation(t *testing.T) { | ||||
| 
 | ||||
| 	// Assert results
 | ||||
| 	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
 | ||||
| 	storedLocation, _ := store.ReadEntry(ctx, sessionId, common.DATA_LOCATION) | ||||
| @ -337,11 +357,14 @@ func TestSaveOfferings(t *testing.T) { | ||||
| 	fm, _ := NewFlagManager(flagsPath) | ||||
| 
 | ||||
| 	flag_allow_update, _ := fm.GetFlag("flag_allow_update") | ||||
| 	flag_offerings_set, _ := fm.GetFlag("flag_offerings_set") | ||||
| 
 | ||||
| 	// Set the flag in the State
 | ||||
| 	mockState := state.NewState(16) | ||||
| 	mockState := state.NewState(108) | ||||
| 	mockState.SetFlag(flag_allow_update) | ||||
| 
 | ||||
| 	expectedResult := resource.Result{} | ||||
| 
 | ||||
| 	// Define test data
 | ||||
| 	offerings := "Bananas" | ||||
| 
 | ||||
| @ -349,6 +372,8 @@ func TestSaveOfferings(t *testing.T) { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	expectedResult.FlagSet = []uint32{flag_offerings_set} | ||||
| 
 | ||||
| 	// Create the Handlers instance with the mock store
 | ||||
| 	h := &Handlers{ | ||||
| 		userdataStore: store, | ||||
| @ -361,7 +386,7 @@ func TestSaveOfferings(t *testing.T) { | ||||
| 
 | ||||
| 	// Assert results
 | ||||
| 	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
 | ||||
| 	storedOfferings, _ := store.ReadEntry(ctx, sessionId, common.DATA_OFFERINGS) | ||||
| @ -376,9 +401,10 @@ func TestSaveGender(t *testing.T) { | ||||
| 	fm, _ := NewFlagManager(flagsPath) | ||||
| 
 | ||||
| 	flag_allow_update, _ := fm.GetFlag("flag_allow_update") | ||||
| 	flag_gender_set, _ := fm.GetFlag("flag_gender_set") | ||||
| 
 | ||||
| 	// Set the flag in the State
 | ||||
| 	mockState := state.NewState(16) | ||||
| 	mockState := state.NewState(108) | ||||
| 	mockState.SetFlag(flag_allow_update) | ||||
| 
 | ||||
| 	// Define test cases
 | ||||
| @ -422,12 +448,16 @@ func TestSaveGender(t *testing.T) { | ||||
| 				flagManager:   fm.parser, | ||||
| 			} | ||||
| 
 | ||||
| 			expectedResult := resource.Result{} | ||||
| 
 | ||||
| 			// Call the method
 | ||||
| 			res, err := h.SaveGender(ctx, "save_gender", tt.input) | ||||
| 
 | ||||
| 			expectedResult.FlagSet = []uint32{flag_gender_set} | ||||
| 
 | ||||
| 			// Assert results
 | ||||
| 			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
 | ||||
| 			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": [ | ||||
|                 { | ||||
|                     "input": "", | ||||
| @ -187,6 +187,26 @@ | ||||
|                 }, | ||||
|                 { | ||||
|                     "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:" | ||||
|                 }, | ||||
|                 { | ||||
| @ -197,10 +217,6 @@ | ||||
|                     "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": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" | ||||
|                 }, | ||||
|                 { | ||||
|                     "input": "0", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
| @ -208,7 +224,7 @@ | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|             "name": "menu_my_account_edit_familyname", | ||||
|             "name": "menu_my_account_edit_familyname_when_all_account__details_have_been_set", | ||||
|             "steps": [ | ||||
|                 { | ||||
|                     "input": "", | ||||
| @ -238,10 +254,6 @@ | ||||
|                     "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": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" | ||||
|                 }, | ||||
|                 { | ||||
|                     "input": "0", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
| @ -250,7 +262,7 @@ | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|             "name": "menu_my_account_edit_gender", | ||||
|             "name": "menu_my_account_edit_gender_when_all_account__details_have_been_set", | ||||
|             "steps": [ | ||||
|                 { | ||||
|                     "input": "", | ||||
| @ -280,10 +292,6 @@ | ||||
|                     "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": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" | ||||
|                 }, | ||||
|                 { | ||||
|                     "input": "0", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
| @ -291,7 +299,7 @@ | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|             "name": "menu_my_account_edit_yob", | ||||
|             "name": "menu_my_account_edit_yob_when_all_account__details_have_been_set", | ||||
|             "steps": [ | ||||
|                 { | ||||
|                     "input": "", | ||||
| @ -321,10 +329,6 @@ | ||||
|                     "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": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" | ||||
|                 }, | ||||
|                 { | ||||
|                     "input": "0", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
| @ -332,7 +336,7 @@ | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|             "name": "menu_my_account_edit_location", | ||||
|             "name": "menu_my_account_edit_location_when_all_account_details_have_been_set", | ||||
|             "steps": [ | ||||
|                 { | ||||
|                     "input": "", | ||||
| @ -362,10 +366,6 @@ | ||||
|                     "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": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" | ||||
|                 }, | ||||
|                 { | ||||
|                     "input": "0", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
| @ -373,7 +373,7 @@ | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|             "name": "menu_my_account_edit_offerings", | ||||
|             "name": "menu_my_account_edit_offerings_when_all_account__details_have_been_set", | ||||
|             "steps": [ | ||||
|                 { | ||||
|                     "input": "", | ||||
| @ -403,10 +403,6 @@ | ||||
|                     "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": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" | ||||
|                 }, | ||||
|                 { | ||||
|                     "input": "0", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
| @ -434,16 +430,12 @@ | ||||
|                 }, | ||||
|                 { | ||||
|                     "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", | ||||
|                     "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", | ||||
|                     "expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit" | ||||
|  | ||||
| @ -3,6 +3,7 @@ package menutraversaltest | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"flag" | ||||
| 	"log" | ||||
| 	"math/rand" | ||||
| 	"os" | ||||
| @ -15,14 +16,15 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	testData      = driver.ReadData() | ||||
| 	testStore     = ".test_state" | ||||
| 	groupTestFile = "group_test.json" | ||||
| 	sessionID     string | ||||
| 	src           = rand.NewSource(42) | ||||
| 	g             = rand.New(src) | ||||
| 	testData  = driver.ReadData() | ||||
| 	testStore = ".test_state" | ||||
| 	sessionID string | ||||
| 	src       = rand.NewSource(42) | ||||
| 	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 { | ||||
| 	uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g)) | ||||
| 	v, err := uu.NewV4() | ||||
| @ -337,7 +339,7 @@ func TestMainMenuSend(t *testing.T) { | ||||
| } | ||||
| 
 | ||||
| func TestGroups(t *testing.T) { | ||||
| 	groups, err := driver.LoadTestGroups(groupTestFile) | ||||
| 	groups, err := driver.LoadTestGroups(*groupTestFile) | ||||
| 	if err != nil { | ||||
| 		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 | ||||
| LOAD get_current_profile_info 0 | ||||
| RELOAD get_current_profile_info | ||||
| MAP get_current_profile_info | ||||
| MOUT back 0 | ||||
| HALT | ||||
| LOAD save_familyname 0 | ||||
| RELOAD set_back  | ||||
| CATCH _ flag_back_set 1 | ||||
| LOAD save_familyname 64 | ||||
| RELOAD save_familyname | ||||
| INCMP _ 0 | ||||
| INCMP pin_entry * | ||||
| CATCH pin_entry flag_familyname_set 1 | ||||
| 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 | ||||
| MOUT back 0 | ||||
| HALT | ||||
| LOAD save_firstname 0 | ||||
| RELOAD set_back  | ||||
| CATCH _ flag_back_set 1 | ||||
| LOAD save_firstname 128 | ||||
| RELOAD save_firstname | ||||
| INCMP _ 0 | ||||
| INCMP pin_entry * | ||||
| CATCH pin_entry flag_firstname_set 1 | ||||
| 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 | ||||
| LOAD get_current_profile_info 0 | ||||
| RELOAD get_current_profile_info | ||||
| LOAD save_location 16 | ||||
| MOUT back 0 | ||||
| HALT | ||||
| LOAD save_location 0 | ||||
| RELOAD set_back  | ||||
| CATCH _ flag_back_set 1 | ||||
| RELOAD save_location | ||||
| 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 | ||||
| LOAD get_current_profile_info 0 | ||||
| RELOAD get_current_profile_info | ||||
| LOAD save_offerings 0 | ||||
| LOAD save_offerings 8 | ||||
| MOUT back 0 | ||||
| HALT | ||||
| RELOAD set_back  | ||||
| CATCH _ flag_back_set 1 | ||||
| RELOAD save_offerings | ||||
| 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 back 0 | ||||
| HALT | ||||
| INCMP my_account 0 | ||||
| LOAD set_back 6 | ||||
| INCMP ^ 0 | ||||
| INCMP edit_first_name 1 | ||||
| INCMP edit_family_name 2 | ||||
| INCMP select_gender 3 | ||||
|  | ||||
| @ -5,10 +5,15 @@ RELOAD get_current_profile_info | ||||
| MAP get_current_profile_info | ||||
| MOUT back 0 | ||||
| HALT | ||||
| RELOAD set_back  | ||||
| CATCH _ flag_back_set 1 | ||||
| LOAD verify_yob 6 | ||||
| RELOAD verify_yob | ||||
| CATCH incorrect_date_format flag_incorrect_date_format 1 | ||||
| LOAD save_yob 0 | ||||
| LOAD save_yob 32 | ||||
| RELOAD save_yob | ||||
| INCMP _ 0 | ||||
| INCMP pin_entry * | ||||
| CATCH pin_entry flag_yob_set 1 | ||||
| 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_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_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 quit 9 | ||||
| HALT | ||||
|  | ||||
| @ -1,4 +1,10 @@ | ||||
| LOAD save_gender 0 | ||||
| LOAD save_gender 32 | ||||
| RELOAD save_gender | ||||
| CATCH incorrect_pin flag_incorrect_pin 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 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 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