From c8a705ff44d311ded6a3e7192ed48b15c325af77 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 3 Jul 2025 17:57:24 +0300 Subject: [PATCH] move voucher related tests --- handlers/application/menuhandler_test.go | 270 ---------------------- handlers/application/vouchers_test.go | 282 +++++++++++++++++++++++ 2 files changed, 282 insertions(+), 270 deletions(-) create mode 100644 handlers/application/vouchers_test.go diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 83f28de..674c60a 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2,7 +2,6 @@ package application import ( "context" - "fmt" "log" "path" "strconv" @@ -14,7 +13,6 @@ import ( "git.defalsify.org/vise.git/resource" "git.defalsify.org/vise.git/state" "git.grassecon.net/grassrootseconomics/common/pin" - "git.grassecon.net/grassrootseconomics/sarafu-api/models" "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks" "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/testservice" "git.grassecon.net/grassrootseconomics/sarafu-vise/store" @@ -27,7 +25,6 @@ import ( visedb "git.defalsify.org/vise.git/db" memdb "git.defalsify.org/vise.git/db/mem" - dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api" ) var ( @@ -494,273 +491,6 @@ func TestQuit(t *testing.T) { } } -func TestManageVouchers(t *testing.T) { - sessionId := "session123" - publicKey := "0X13242618721" - - ctx, userStore := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - _, logdb := InitializeTestLogdbStore(t) - - logDb := store.LogDb{ - Db: logdb, - } - - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Fatal(err) - } - flag_no_active_voucher, err := fm.GetFlag("flag_no_active_voucher") - if err != nil { - t.Fatal(err) - } - flag_api_error, err := fm.GetFlag("flag_api_call_error") - - if err != nil { - t.Fatal(err) - } - - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) - if err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - vouchersResp []dataserviceapi.TokenHoldings - storedActiveVoucher string - expectedVoucherSymbols []byte - expectedUpdatedAddress []byte - expectedResult resource.Result - }{ - { - name: "No vouchers available", - vouchersResp: []dataserviceapi.TokenHoldings{}, - expectedVoucherSymbols: []byte(""), - expectedUpdatedAddress: []byte(""), - expectedResult: resource.Result{ - FlagSet: []uint32{flag_no_active_voucher}, - FlagReset: []uint32{flag_api_error}, - }, - }, - { - name: "Set default voucher when no active voucher is set", - vouchersResp: []dataserviceapi.TokenHoldings{ - { - TokenAddress: "0x123", - TokenSymbol: "TOKEN1", - TokenDecimals: "18", - Balance: "100", - }, - }, - expectedVoucherSymbols: []byte("1:TOKEN1"), - expectedUpdatedAddress: []byte("0x123"), - expectedResult: resource.Result{ - FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, - }, - }, - { - name: "Check and update active voucher balance", - vouchersResp: []dataserviceapi.TokenHoldings{ - {TokenAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100"}, - {TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200"}, - }, - storedActiveVoucher: "SRF", - expectedVoucherSymbols: []byte("1:SRF\n2:MILO"), - expectedUpdatedAddress: []byte("0xd4c288865Ce"), - expectedResult: resource.Result{ - FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockAccountService := new(mocks.MockAccountService) - - h := &MenuHandlers{ - userdataStore: userStore, - accountService: mockAccountService, - flagManager: fm, - logDb: logDb, - } - - mockAccountService.On("FetchVouchers", string(publicKey)).Return(tt.vouchersResp, nil) - - // Store active voucher if needed - if tt.storedActiveVoucher != "" { - err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) - if err != nil { - t.Fatal(err) - } - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) - if err != nil { - t.Fatal(err) - } - } - - res, err := h.ManageVouchers(ctx, "manage_vouchers", []byte("")) - assert.NoError(t, err) - assert.Equal(t, tt.expectedResult, res) - - if tt.storedActiveVoucher != "" { - // Validate stored voucher symbols - voucherData, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) - assert.NoError(t, err) - assert.Equal(t, tt.expectedVoucherSymbols, voucherData) - - // Validate stored active contract address - updatedAddress, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) - assert.NoError(t, err) - assert.Equal(t, tt.expectedUpdatedAddress, updatedAddress) - - mockAccountService.AssertExpectations(t) - } - }) - } -} - -func TestGetVoucherList(t *testing.T) { - sessionId := "session123" - - ctx, store := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - - // Initialize MenuHandlers - h := &MenuHandlers{ - userdataStore: store, - ReplaceSeparatorFunc: mockReplaceSeparator, - } - - mockSymbols := []byte("1:SRF\n2:MILO") - mockBalances := []byte("1:10.099999\n2:40.7") - - // Put voucher symnols and balances data to the store - err := store.WriteEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS, mockSymbols) - if err != nil { - t.Fatal(err) - } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_VOUCHER_BALANCES, mockBalances) - if err != nil { - t.Fatal(err) - } - - expectedList := []byte("1: SRF 10.09\n2: MILO 40.70") - - res, err := h.GetVoucherList(ctx, "", []byte("")) - - assert.NoError(t, err) - assert.Equal(t, res.Content, string(expectedList)) -} - -func TestViewVoucher(t *testing.T) { - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Logf(err.Error()) - } - ctx, store := InitializeTestStore(t) - sessionId := "session123" - ctx = context.WithValue(ctx, "SessionId", sessionId) - - h := &MenuHandlers{ - userdataStore: store, - flagManager: fm, - } - - // Define mock voucher data - mockData := map[storedb.DataTyp][]byte{ - storedb.DATA_VOUCHER_SYMBOLS: []byte("1:SRF\n2:MILO"), - storedb.DATA_VOUCHER_BALANCES: []byte("1:100\n2:200"), - storedb.DATA_VOUCHER_DECIMALS: []byte("1:6\n2:4"), - storedb.DATA_VOUCHER_ADDRESSES: []byte("1:0xd4c288865Ce\n2:0x41c188d63Qa"), - } - - // Put the data - for key, value := range mockData { - err := store.WriteEntry(ctx, sessionId, key, []byte(value)) - if err != nil { - t.Fatal(err) - } - } - - res, err := h.ViewVoucher(ctx, "view_voucher", []byte("1")) - assert.NoError(t, err) - assert.Equal(t, res.Content, "Symbol: SRF\nBalance: 100") -} - -func TestSetVoucher(t *testing.T) { - ctx, store := InitializeTestStore(t) - sessionId := "session123" - - ctx = context.WithValue(ctx, "SessionId", sessionId) - - h := &MenuHandlers{ - userdataStore: store, - } - - // Define the temporary voucher data - tempData := &dataserviceapi.TokenHoldings{ - TokenSymbol: "SRF", - Balance: "200", - TokenDecimals: "6", - TokenAddress: "0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9", - } - - expectedData := fmt.Sprintf("%s,%s,%s,%s", tempData.TokenSymbol, tempData.Balance, tempData.TokenDecimals, tempData.TokenAddress) - - // store the expectedData - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(expectedData)); err != nil { - t.Fatal(err) - } - - res, err := h.SetVoucher(ctx, "set_voucher", []byte("")) - - assert.NoError(t, err) - - assert.Equal(t, string(tempData.TokenSymbol), res.Content) -} - -func TestGetVoucherDetails(t *testing.T) { - ctx, store := InitializeTestStore(t) - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Logf(err.Error()) - } - - flag_api_error, _ := fm.GetFlag("flag_api_call_error") - mockAccountService := new(mocks.MockAccountService) - - sessionId := "session123" - ctx = context.WithValue(ctx, "SessionId", sessionId) - expectedResult := resource.Result{} - - tokA_AAddress := "0x0000000000000000000000000000000000000000" - - h := &MenuHandlers{ - userdataStore: store, - flagManager: fm, - accountService: mockAccountService, - } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte(tokA_AAddress)) - if err != nil { - t.Fatal(err) - } - tokenDetails := &models.VoucherDataResult{ - TokenName: "Token A", - TokenSymbol: "TOKA", - TokenLocation: "Kilifi,Kenya", - TokenCommodity: "Farming", - } - expectedResult.Content = fmt.Sprintf( - "Name: %s\nSymbol: %s\nCommodity: %s\nLocation: %s", tokenDetails.TokenName, tokenDetails.TokenSymbol, tokenDetails.TokenCommodity, tokenDetails.TokenLocation, - ) - mockAccountService.On("VoucherData", string(tokA_AAddress)).Return(tokenDetails, nil) - res, err := h.GetVoucherDetails(ctx, "SessionId", []byte("")) - expectedResult.FlagReset = append(expectedResult.FlagReset, flag_api_error) - assert.NoError(t, err) - assert.Equal(t, expectedResult, res) -} - func TestRetrieveBlockedNumber(t *testing.T) { sessionId := "session123" blockedNumber := "0712345678" diff --git a/handlers/application/vouchers_test.go b/handlers/application/vouchers_test.go new file mode 100644 index 0000000..e380829 --- /dev/null +++ b/handlers/application/vouchers_test.go @@ -0,0 +1,282 @@ +package application + +import ( + "context" + "fmt" + "testing" + + "git.defalsify.org/vise.git/resource" + "git.grassecon.net/grassrootseconomics/sarafu-api/models" + "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks" + "git.grassecon.net/grassrootseconomics/sarafu-vise/store" + storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" + "github.com/alecthomas/assert/v2" + dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api" +) + +func TestManageVouchers(t *testing.T) { + sessionId := "session123" + publicKey := "0X13242618721" + + ctx, userStore := InitializeTestStore(t) + ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } + + fm, err := NewFlagManager(flagsPath) + if err != nil { + t.Fatal(err) + } + flag_no_active_voucher, err := fm.GetFlag("flag_no_active_voucher") + if err != nil { + t.Fatal(err) + } + flag_api_error, err := fm.GetFlag("flag_api_call_error") + + if err != nil { + t.Fatal(err) + } + + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + if err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + vouchersResp []dataserviceapi.TokenHoldings + storedActiveVoucher string + expectedVoucherSymbols []byte + expectedUpdatedAddress []byte + expectedResult resource.Result + }{ + { + name: "No vouchers available", + vouchersResp: []dataserviceapi.TokenHoldings{}, + expectedVoucherSymbols: []byte(""), + expectedUpdatedAddress: []byte(""), + expectedResult: resource.Result{ + FlagSet: []uint32{flag_no_active_voucher}, + FlagReset: []uint32{flag_api_error}, + }, + }, + { + name: "Set default voucher when no active voucher is set", + vouchersResp: []dataserviceapi.TokenHoldings{ + { + TokenAddress: "0x123", + TokenSymbol: "TOKEN1", + TokenDecimals: "18", + Balance: "100", + }, + }, + expectedVoucherSymbols: []byte("1:TOKEN1"), + expectedUpdatedAddress: []byte("0x123"), + expectedResult: resource.Result{ + FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, + }, + }, + { + name: "Check and update active voucher balance", + vouchersResp: []dataserviceapi.TokenHoldings{ + {TokenAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100"}, + {TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200"}, + }, + storedActiveVoucher: "SRF", + expectedVoucherSymbols: []byte("1:SRF\n2:MILO"), + expectedUpdatedAddress: []byte("0xd4c288865Ce"), + expectedResult: resource.Result{ + FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockAccountService := new(mocks.MockAccountService) + + h := &MenuHandlers{ + userdataStore: userStore, + accountService: mockAccountService, + flagManager: fm, + logDb: logDb, + } + + mockAccountService.On("FetchVouchers", string(publicKey)).Return(tt.vouchersResp, nil) + + // Store active voucher if needed + if tt.storedActiveVoucher != "" { + err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) + if err != nil { + t.Fatal(err) + } + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) + if err != nil { + t.Fatal(err) + } + } + + res, err := h.ManageVouchers(ctx, "manage_vouchers", []byte("")) + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, res) + + if tt.storedActiveVoucher != "" { + // Validate stored voucher symbols + voucherData, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) + assert.NoError(t, err) + assert.Equal(t, tt.expectedVoucherSymbols, voucherData) + + // Validate stored active contract address + updatedAddress, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) + assert.NoError(t, err) + assert.Equal(t, tt.expectedUpdatedAddress, updatedAddress) + + mockAccountService.AssertExpectations(t) + } + }) + } +} + +func TestGetVoucherList(t *testing.T) { + sessionId := "session123" + + ctx, store := InitializeTestStore(t) + ctx = context.WithValue(ctx, "SessionId", sessionId) + + // Initialize MenuHandlers + h := &MenuHandlers{ + userdataStore: store, + ReplaceSeparatorFunc: mockReplaceSeparator, + } + + mockSymbols := []byte("1:SRF\n2:MILO") + mockBalances := []byte("1:10.099999\n2:40.7") + + // Put voucher symnols and balances data to the store + err := store.WriteEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS, mockSymbols) + if err != nil { + t.Fatal(err) + } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_VOUCHER_BALANCES, mockBalances) + if err != nil { + t.Fatal(err) + } + + expectedList := []byte("1: SRF 10.09\n2: MILO 40.70") + + res, err := h.GetVoucherList(ctx, "", []byte("")) + + assert.NoError(t, err) + assert.Equal(t, res.Content, string(expectedList)) +} + +func TestViewVoucher(t *testing.T) { + fm, err := NewFlagManager(flagsPath) + if err != nil { + t.Logf(err.Error()) + } + ctx, store := InitializeTestStore(t) + sessionId := "session123" + ctx = context.WithValue(ctx, "SessionId", sessionId) + + h := &MenuHandlers{ + userdataStore: store, + flagManager: fm, + } + + // Define mock voucher data + mockData := map[storedb.DataTyp][]byte{ + storedb.DATA_VOUCHER_SYMBOLS: []byte("1:SRF\n2:MILO"), + storedb.DATA_VOUCHER_BALANCES: []byte("1:100\n2:200"), + storedb.DATA_VOUCHER_DECIMALS: []byte("1:6\n2:4"), + storedb.DATA_VOUCHER_ADDRESSES: []byte("1:0xd4c288865Ce\n2:0x41c188d63Qa"), + } + + // Put the data + for key, value := range mockData { + err := store.WriteEntry(ctx, sessionId, key, []byte(value)) + if err != nil { + t.Fatal(err) + } + } + + res, err := h.ViewVoucher(ctx, "view_voucher", []byte("1")) + assert.NoError(t, err) + assert.Equal(t, res.Content, "Symbol: SRF\nBalance: 100") +} + +func TestSetVoucher(t *testing.T) { + ctx, store := InitializeTestStore(t) + sessionId := "session123" + + ctx = context.WithValue(ctx, "SessionId", sessionId) + + h := &MenuHandlers{ + userdataStore: store, + } + + // Define the temporary voucher data + tempData := &dataserviceapi.TokenHoldings{ + TokenSymbol: "SRF", + Balance: "200", + TokenDecimals: "6", + TokenAddress: "0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9", + } + + expectedData := fmt.Sprintf("%s,%s,%s,%s", tempData.TokenSymbol, tempData.Balance, tempData.TokenDecimals, tempData.TokenAddress) + + // store the expectedData + if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(expectedData)); err != nil { + t.Fatal(err) + } + + res, err := h.SetVoucher(ctx, "set_voucher", []byte("")) + + assert.NoError(t, err) + + assert.Equal(t, string(tempData.TokenSymbol), res.Content) +} + +func TestGetVoucherDetails(t *testing.T) { + ctx, store := InitializeTestStore(t) + fm, err := NewFlagManager(flagsPath) + if err != nil { + t.Logf(err.Error()) + } + + flag_api_error, _ := fm.GetFlag("flag_api_call_error") + mockAccountService := new(mocks.MockAccountService) + + sessionId := "session123" + ctx = context.WithValue(ctx, "SessionId", sessionId) + expectedResult := resource.Result{} + + tokA_AAddress := "0x0000000000000000000000000000000000000000" + + h := &MenuHandlers{ + userdataStore: store, + flagManager: fm, + accountService: mockAccountService, + } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte(tokA_AAddress)) + if err != nil { + t.Fatal(err) + } + tokenDetails := &models.VoucherDataResult{ + TokenName: "Token A", + TokenSymbol: "TOKA", + TokenLocation: "Kilifi,Kenya", + TokenCommodity: "Farming", + } + expectedResult.Content = fmt.Sprintf( + "Name: %s\nSymbol: %s\nCommodity: %s\nLocation: %s", tokenDetails.TokenName, tokenDetails.TokenSymbol, tokenDetails.TokenCommodity, tokenDetails.TokenLocation, + ) + mockAccountService.On("VoucherData", string(tokA_AAddress)).Return(tokenDetails, nil) + res, err := h.GetVoucherDetails(ctx, "SessionId", []byte("")) + expectedResult.FlagReset = append(expectedResult.FlagReset, flag_api_error) + assert.NoError(t, err) + assert.Equal(t, expectedResult, res) +}