Merge pull request 'force-restart-state' (#223) from force-restart-state into master
Reviewed-on: #223
This commit is contained in:
		
						commit
						7c4c73125e
					
				| @ -129,6 +129,11 @@ func (h *Handlers) Init(ctx context.Context, sym string, input []byte) (resource | ||||
| 	h.st = h.pe.GetState() | ||||
| 	h.ca = h.pe.GetMemory() | ||||
| 
 | ||||
| 	if len(input) == 0 { | ||||
| 		// move to the top node
 | ||||
| 		h.st.Code = []byte{} | ||||
| 	} | ||||
| 
 | ||||
| 	sessionId, _ := ctx.Value("SessionId").(string) | ||||
| 	flag_admin_privilege, _ := h.flagManager.GetFlag("flag_admin_privilege") | ||||
| 
 | ||||
|  | ||||
| @ -8,6 +8,7 @@ import ( | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"git.defalsify.org/vise.git/cache" | ||||
| 	"git.defalsify.org/vise.git/lang" | ||||
| 	"git.defalsify.org/vise.git/persist" | ||||
| 	"git.defalsify.org/vise.git/resource" | ||||
| @ -15,6 +16,7 @@ import ( | ||||
| 	"git.grassecon.net/urdt/ussd/internal/storage" | ||||
| 	"git.grassecon.net/urdt/ussd/internal/testutil/mocks" | ||||
| 	"git.grassecon.net/urdt/ussd/internal/testutil/testservice" | ||||
| 	"git.grassecon.net/urdt/ussd/internal/utils" | ||||
| 	"git.grassecon.net/urdt/ussd/models" | ||||
| 
 | ||||
| 	"git.grassecon.net/urdt/ussd/common" | ||||
| @ -119,6 +121,102 @@ func TestNewHandlers(t *testing.T) { | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func TestInit(t *testing.T) { | ||||
| 	sessionId := "session123" | ||||
| 	ctx, store := InitializeTestStore(t) | ||||
| 	ctx = context.WithValue(ctx, "SessionId", sessionId) | ||||
| 
 | ||||
| 	fm, err := NewFlagManager(flagsPath) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	adminstore, err := utils.NewAdminStore(ctx, "admin_numbers") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	st := state.NewState(128) | ||||
| 	ca := cache.NewCache() | ||||
| 
 | ||||
| 	flag_admin_privilege, _ := fm.GetFlag("flag_admin_privilege") | ||||
| 
 | ||||
| 	tests := []struct { | ||||
| 		name           string | ||||
| 		setup          func() (*Handlers, context.Context) | ||||
| 		input          []byte | ||||
| 		expectedResult resource.Result | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name: "Handler not ready", | ||||
| 			setup: func() (*Handlers, context.Context) { | ||||
| 				return &Handlers{}, ctx | ||||
| 			}, | ||||
| 			input:          []byte("1"), | ||||
| 			expectedResult: resource.Result{}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "State and memory initialization", | ||||
| 			setup: func() (*Handlers, context.Context) { | ||||
| 				pe := persist.NewPersister(store).WithSession(sessionId).WithContent(st, ca) | ||||
| 				h := &Handlers{ | ||||
| 					flagManager: fm.parser, | ||||
| 					adminstore:  adminstore, | ||||
| 					pe:          pe, | ||||
| 				} | ||||
| 				return h, context.WithValue(ctx, "SessionId", sessionId) | ||||
| 			}, | ||||
| 			input: []byte("1"), | ||||
| 			expectedResult: resource.Result{ | ||||
| 				FlagReset: []uint32{flag_admin_privilege}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "Non-admin session initialization", | ||||
| 			setup: func() (*Handlers, context.Context) { | ||||
| 				pe := persist.NewPersister(store).WithSession("0712345678").WithContent(st, ca) | ||||
| 				h := &Handlers{ | ||||
| 					flagManager: fm.parser, | ||||
| 					adminstore:  adminstore, | ||||
| 					pe:          pe, | ||||
| 				} | ||||
| 				return h, context.WithValue(context.Background(), "SessionId", "0712345678") | ||||
| 			}, | ||||
| 			input: []byte("1"), | ||||
| 			expectedResult: resource.Result{ | ||||
| 				FlagReset: []uint32{flag_admin_privilege}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "Move to top node on empty input", | ||||
| 			setup: func() (*Handlers, context.Context) { | ||||
| 				pe := persist.NewPersister(store).WithSession(sessionId).WithContent(st, ca) | ||||
| 				h := &Handlers{ | ||||
| 					flagManager: fm.parser, | ||||
| 					adminstore:  adminstore, | ||||
| 					pe:          pe, | ||||
| 				} | ||||
| 				st.Code = []byte("some pending bytecode") | ||||
| 				return h, context.WithValue(ctx, "SessionId", sessionId) | ||||
| 			}, | ||||
| 			input: []byte(""), | ||||
| 			expectedResult: resource.Result{ | ||||
| 				FlagReset: []uint32{flag_admin_privilege}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			h, testCtx := tt.setup() | ||||
| 			res, err := h.Init(testCtx, "", tt.input) | ||||
| 
 | ||||
| 			assert.NoError(t, err, "Unexpected error occurred") | ||||
| 			assert.Equal(t, res, tt.expectedResult, "Expected result should match actual result") | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestCreateAccount(t *testing.T) { | ||||
| 	sessionId := "session123" | ||||
| 	ctx, store := InitializeTestStore(t) | ||||
|  | ||||
| @ -17,8 +17,7 @@ var ( | ||||
| type DefaultRequestParser struct { | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| func(rp *DefaultRequestParser) GetSessionId(rq any) (string, error) { | ||||
| func (rp *DefaultRequestParser) GetSessionId(rq any) (string, error) { | ||||
| 	rqv, ok := rq.(*http.Request) | ||||
| 	if !ok { | ||||
| 		return "", handlers.ErrInvalidRequest | ||||
| @ -30,7 +29,7 @@ func(rp *DefaultRequestParser) GetSessionId(rq any) (string, error) { | ||||
| 	return v, nil | ||||
| } | ||||
| 
 | ||||
| func(rp *DefaultRequestParser) GetInput(rq any) ([]byte, error) { | ||||
| func (rp *DefaultRequestParser) GetInput(rq any) ([]byte, error) { | ||||
| 	rqv, ok := rq.(*http.Request) | ||||
| 	if !ok { | ||||
| 		return nil, handlers.ErrInvalidRequest | ||||
| @ -53,25 +52,24 @@ func ToSessionHandler(h handlers.RequestHandler) *SessionHandler { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func(f *SessionHandler) writeError(w http.ResponseWriter, code int, err error) { | ||||
| func (f *SessionHandler) writeError(w http.ResponseWriter, code int, err error) { | ||||
| 	s := err.Error() | ||||
| 	w.Header().Set("Content-Length", strconv.Itoa(len(s))) | ||||
| 	w.WriteHeader(code) | ||||
| 	_, err = w.Write([]byte{}) | ||||
| 	_, err = w.Write([]byte(s)) | ||||
| 	if err != nil { | ||||
| 		logg.Errorf("error writing error!!", "err", err, "olderr", s) | ||||
| 		w.WriteHeader(500) | ||||
| 	} | ||||
| 	return  | ||||
| } | ||||
| 
 | ||||
| func(f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { | ||||
| func (f *SessionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { | ||||
| 	var code int | ||||
| 	var err error | ||||
| 	var perr error | ||||
| 
 | ||||
| 	rqs := handlers.RequestSession{ | ||||
| 		Ctx: req.Context(), | ||||
| 		Ctx:    req.Context(), | ||||
| 		Writer: w, | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -298,9 +298,10 @@ func TestMainMenuSend(t *testing.T) { | ||||
| 	ctx := context.Background() | ||||
| 	sessions := testData | ||||
| 	for _, session := range sessions { | ||||
| 		groups := driver.FilterGroupsByName(session.Groups, "send_with_invalid_inputs") | ||||
| 		groups := driver.FilterGroupsByName(session.Groups, "send_with_invite") | ||||
| 		for _, group := range groups { | ||||
| 			for _, step := range group.Steps { | ||||
| 			for index, step := range group.Steps { | ||||
| 				t.Logf("step %v with input %v", index, step.Input) | ||||
| 				cont, err := en.Exec(ctx, []byte(step.Input)) | ||||
| 				if err != nil { | ||||
| 					t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) | ||||
|  | ||||
| @ -64,8 +64,8 @@ | ||||
|                         "expectedContent": "Enter recipient's phone number/address/alias:\n0:Back" | ||||
|                     }, | ||||
|                     { | ||||
|                         "input": "000", | ||||
|                         "expectedContent": "000 is invalid, please try again:\n1:Retry\n9:Quit" | ||||
|                         "input": "0@0", | ||||
|                         "expectedContent": "0@0 is invalid, please try again:\n1:Retry\n9:Quit" | ||||
|                     }, | ||||
|                     { | ||||
|                         "input": "1", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user