menu-traversals #108
							
								
								
									
										141
									
								
								internal/handlers/ussd/menu_traversal_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								internal/handlers/ussd/menu_traversal_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,141 @@ | |||||||
|  | package ussd | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"path" | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"git.defalsify.org/vise.git/db" | ||||||
|  | 	fsdb "git.defalsify.org/vise.git/db/fs" | ||||||
|  | 	"git.defalsify.org/vise.git/engine" | ||||||
|  | 	"git.defalsify.org/vise.git/persist" | ||||||
|  | 	"git.defalsify.org/vise.git/resource" | ||||||
|  | 	"git.grassecon.net/urdt/ussd/internal/storage" | ||||||
|  | 	"git.grassecon.net/urdt/ussd/testdata" | ||||||
|  | 	testdataloader "github.com/peteole/testdata-loader" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	dataGenerated bool   = false | ||||||
|  | 	dataDir       string = testdata.DataDir | ||||||
|  | 	BaseDir              = testdataloader.GetBasePath() | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type testWrapper struct { | ||||||
|  | 	resource.Resource | ||||||
|  | 	db db.Db | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func generateTestData(t *testing.T) { | ||||||
|  | 	if dataGenerated { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var err error | ||||||
|  | 	dataDir, err = testdata.Generate() | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newTestWrapper(path string) testWrapper { | ||||||
|  | 	ctx := context.Background() | ||||||
|  | 	store := fsdb.NewFsDb() | ||||||
|  | 	store.Connect(ctx, path) | ||||||
|  | 	rs := resource.NewDbResource(store) | ||||||
|  | 	rs.With(db.DATATYPE_STATICLOAD) | ||||||
|  | 	wr := testWrapper{ | ||||||
|  | 		rs, | ||||||
|  | 		store, | ||||||
|  | 	} | ||||||
|  | 	rs.AddLocalFunc("quit", quit) | ||||||
|  | 
 | ||||||
|  | 	return wr | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func quit(ctx context.Context, sym string, input []byte) (resource.Result, error) { | ||||||
|  | 	return resource.Result{ | ||||||
|  | 		Content: "Thank you for using Sarafu network", | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestTerms(t *testing.T) { | ||||||
|  | 	generateTestData(t) | ||||||
|  | 	ctx := context.Background() | ||||||
|  | 	rs := newTestWrapper(dataDir) | ||||||
|  | 	cfg := engine.Config{ | ||||||
|  | 		Root:      "terms", | ||||||
|  | 		FlagCount: uint32(9), | ||||||
|  | 	} | ||||||
|  | 	store := storage.NewThreadGdbmDb() | ||||||
|  | 	storeFile := path.Join(baseDir, "state.gdbm") | ||||||
|  | 	err := store.Connect(ctx, storeFile) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fail() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	pr := persist.NewPersister(store) | ||||||
|  | 	en := engine.NewEngine(cfg, &rs) | ||||||
|  | 	en.WithPersister(pr) | ||||||
|  | 	if pr.GetState() == nil || pr.GetMemory() == nil { | ||||||
|  | 		t.Fail() | ||||||
|  | 	} | ||||||
|  | 	_, err = en.Exec(ctx, []byte{}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	w := bytes.NewBuffer(nil) | ||||||
|  | 	_, err = en.Flush(ctx, w) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	b := w.Bytes() | ||||||
|  | 
 | ||||||
|  | 	expect_str := `Do you agree to terms and conditions? | ||||||
|  | 1:yes | ||||||
|  | 2:no` | ||||||
|  | 
 | ||||||
|  | 	if !bytes.Equal(b, []byte(expect_str)) { | ||||||
|  | 		t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect_str, b) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	tests := []struct { | ||||||
|  | 		name           string | ||||||
|  | 		expectedSymbol string | ||||||
|  | 		input          []byte | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			name:           "Test accept terms option(yes)", | ||||||
|  | 			expectedSymbol: "create_pin", | ||||||
|  | 			input:          []byte("1"), | ||||||
|  | 		}, | ||||||
|  | 		// {
 | ||||||
|  | 		// 	name:           "Test reject terms option(no)",
 | ||||||
|  | 		// 	input:          []byte("2"),
 | ||||||
|  | 		// 	expectedSymbol: "quit",
 | ||||||
|  | 		// },
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, tt := range tests { | ||||||
|  | 		t.Run(tt.name, func(t *testing.T) { | ||||||
|  | 			_, err = en.Exec(ctx, tt.input) | ||||||
|  | 			if err != nil { | ||||||
|  | 				t.Fatal(err) | ||||||
|  | 			} | ||||||
|  | 			w := bytes.NewBuffer(nil) | ||||||
|  | 			_, err = en.Flush(ctx, w) | ||||||
|  | 			if err != nil { | ||||||
|  | 				t.Fatal(err) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			b = w.Bytes() | ||||||
|  | 			fmt.Println("result", string(b)) | ||||||
|  | 			symbol, _ := pr.State.Where() | ||||||
|  | 			 | ||||||
|  | 			if symbol != tt.expectedSymbol { | ||||||
|  | 				t.Fatalf("expected symbol to be 'create_pin', got %s", symbol) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										0
									
								
								testdata/main.vis
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								testdata/main.vis
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										119
									
								
								testdata/testdata.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								testdata/testdata.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | |||||||
|  | package testdata | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
|  |     "path" | ||||||
|  | 	"git.defalsify.org/vise.git/db" | ||||||
|  | 	fsdb "git.defalsify.org/vise.git/db/fs" | ||||||
|  | 	"git.defalsify.org/vise.git/logging" | ||||||
|  | 	"git.defalsify.org/vise.git/vm" | ||||||
|  | 	testdataloader "github.com/peteole/testdata-loader" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | func outNew(sym string, b []byte, tpl string, data map[string]string) error { | ||||||
|  | 	logg.Debugf("testdata out", "sym", sym) | ||||||
|  | 	store.SetPrefix(db.DATATYPE_TEMPLATE) | ||||||
|  | 	err := store.Put(ctx, []byte(sym), []byte(tpl)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	store.SetPrefix(db.DATATYPE_BIN) | ||||||
|  | 	err = store.Put(ctx, []byte(sym), b) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	store.SetPrefix(db.DATATYPE_STATICLOAD) | ||||||
|  | 	for k, v := range data { | ||||||
|  | 		logg.Debugf("testdata out staticload", "sym", sym, "k", k, "v", v) | ||||||
|  | 		err = store.Put(ctx, []byte(k), []byte(v)) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ctx     = context.Background() | ||||||
|  | 	store   = fsdb.NewFsDb() | ||||||
|  | 	out     = outNew | ||||||
|  | 	logg    = logging.NewVanilla().WithDomain("testdata") | ||||||
|  | 	BaseDir = testdataloader.GetBasePath() | ||||||
|  | 	DataDir = "" | ||||||
|  | 	dirLock = false | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type genFunc func() error | ||||||
|  | 
 | ||||||
|  | func terms() error { | ||||||
|  | 	b := []byte{} | ||||||
|  | 	b = vm.NewLine(b, vm.MOUT, []string{"yes", "1"}, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.MOUT, []string{"no", "2"}, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.HALT, nil, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.INCMP, []string{"create_pin", "1"}, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.INCMP, []string{"quit", "2"}, nil, nil) | ||||||
|  | 	tpl := "Do you agree to terms and conditions?" | ||||||
|  | 	return out("terms", b, tpl, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func createPin() error { | ||||||
|  | 	b := []byte{} | ||||||
|  | 	b = vm.NewLine(b, vm.MOUT, []string{"exit", "0"}, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.HALT, nil, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.INCMP, []string{"0", "1"}, nil, nil) | ||||||
|  | 	tpl := "create pin" | ||||||
|  | 	return out("create_pin", b, tpl, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func quit() error { | ||||||
|  | 	// b := []byte{}
 | ||||||
|  | 	// b = vm.NewLine(b, vm.LOAD, []string{"quit"}, []byte{0x00}, nil)
 | ||||||
|  | 	// //b = vm.NewLine(b, vm.RELOAD, []string{"quit"}, []byte{0x00}, nil)
 | ||||||
|  | 	// b = vm.NewLine(b, vm.HALT, nil, nil, nil)
 | ||||||
|  | 
 | ||||||
|  | 	// return out("quit", b, "quit", nil)
 | ||||||
|  | 	b := vm.NewLine(nil, vm.LOAD, []string{"quit"}, []byte{0x00}, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.RELOAD, []string{"quit"}, nil, nil) | ||||||
|  | 	b = vm.NewLine(b, vm.HALT, nil, nil, nil) | ||||||
|  | 
 | ||||||
|  | 	fp := path.Join(DataDir, "nothing.bin") | ||||||
|  | 	err := os.WriteFile(fp, b, 0600) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func generate() error { | ||||||
|  | 	err := os.MkdirAll(DataDir, 0755) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	store = fsdb.NewFsDb() | ||||||
|  | 	store.Connect(ctx, DataDir) | ||||||
|  | 	store.SetLock(db.DATATYPE_TEMPLATE, false) | ||||||
|  | 	store.SetLock(db.DATATYPE_BIN, false) | ||||||
|  | 	store.SetLock(db.DATATYPE_MENU, false) | ||||||
|  | 	store.SetLock(db.DATATYPE_STATICLOAD, false) | ||||||
|  | 
 | ||||||
|  | 	fns := []genFunc{terms, createPin, quit} | ||||||
|  | 	for _, fn := range fns { | ||||||
|  | 		err = fn() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Generate() (string, error) { | ||||||
|  | 	dir, err := ioutil.TempDir("", "vise_testdata_") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	DataDir = dir | ||||||
|  | 	dirLock = true | ||||||
|  | 	err = generate() | ||||||
|  | 	return dir, err | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user