diff --git a/internal/handlers/ussd/menuhandler_test.go b/internal/handlers/ussd/menuhandler_test.go index 5755092..79c0c47 100644 --- a/internal/handlers/ussd/menuhandler_test.go +++ b/internal/handlers/ussd/menuhandler_test.go @@ -3,6 +3,7 @@ package ussd import ( "context" "encoding/json" + "fmt" "os" "path/filepath" "testing" @@ -690,7 +691,6 @@ func TestSaveOfferings(t *testing.T) { } } - func TestSaveGender(t *testing.T) { // Create a new instance of MockAccountFileHandler mockFileHandler := new(mocks.MockAccountFileHandler) @@ -732,7 +732,7 @@ func TestSaveGender(t *testing.T) { expectedError: nil, expectedGender: "Unspecified", }, - + { name: "Empty Input", input: []byte{}, @@ -752,7 +752,7 @@ func TestSaveGender(t *testing.T) { mockFileHandler.On("WriteAccountData", mock.MatchedBy(func(data map[string]string) bool { return data["Gender"] == tt.expectedGender })).Return(tt.writeError) - } else if len(tt.input) == 0 { + } else if len(tt.input) == 0 { // For empty input, no WriteAccountData call should be made mockFileHandler.On("WriteAccountData", mock.Anything).Maybe().Return(tt.writeError) } @@ -876,3 +876,95 @@ func TestGetAmount(t *testing.T) { } } +func TestGetProfileInfo(t *testing.T) { + tests := []struct { + name string + accountData map[string]string + readError error + expectedResult resource.Result + expectedError error + }{ + { + name: "Complete Profile", + accountData: map[string]string{ + "FirstName": "John", + "FamilyName": "Doe", + "Gender": "Male", + "YOB": "1980", + "Location": "Mombasa", + "Offerings": "Product A", + }, + readError: nil, + expectedResult: resource.Result{ + Content: fmt.Sprintf( + "Name: %s %s\nGender: %s\nAge: %d\nLocation: %s\nYou provide: %s\n", + "John", "Doe", "Male", 44, "Mombasa", "Product A", + ), + }, + expectedError: nil, + }, + { + name: "Profile with Not Provided Fields", + accountData: map[string]string{ + "FirstName": "Not provided", + "FamilyName": "Doe", + "Gender": "Female", + "YOB": "1995", + "Location": "Not provided", + "Offerings": "Service B", + }, + readError: nil, + expectedResult: resource.Result{ + Content: fmt.Sprintf( + "Name: %s\nGender: %s\nAge: %d\nLocation: %s\nYou provide: %s\n", + "Not provided", "Female", 29, "Not provided", "Service B", + ), + }, + expectedError: nil, + }, + { + name: "Profile with YOB as Not provided", + accountData: map[string]string{ + "FirstName": "Not provided", + "FamilyName": "Doe", + "Gender": "Female", + "YOB": "Not provided", + "Location": "Not provided", + "Offerings": "Service B", + }, + readError: nil, + expectedResult: resource.Result{ + Content: fmt.Sprintf( + "Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n", + "Not provided", "Female", "Not provided", "Not provided", "Service B", + ), + }, + expectedError: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Create a new instance of MockAccountFileHandler + mockFileHandler := new(mocks.MockAccountFileHandler) + + // Set up the mock expectations + mockFileHandler.On("ReadAccountData").Return(tt.accountData, tt.readError) + + // Create the Handlers instance with the mock file handler + h := &Handlers{ + accountFileHandler: mockFileHandler, + } + + // Call the method + result, err := h.GetProfileInfo(context.Background(), "get_profile_info", nil) + + // Assert the results + assert.Equal(t, tt.expectedResult, result) + assert.Equal(t, tt.expectedError, err) + + // Assert all expectations were met + mockFileHandler.AssertExpectations(t) + }) + } +} \ No newline at end of file