-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtransfers_service_test.go
129 lines (100 loc) · 3.65 KB
/
transfers_service_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package flutterwave
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/NdoleStudio/flutterwave-go/internal/helpers"
"github.com/NdoleStudio/flutterwave-go/internal/stubs"
"github.com/stretchr/testify/assert"
)
func TestTransfersService_Rate(t *testing.T) {
// Setup
t.Parallel()
// Arrange
server := helpers.MakeTestServer(http.StatusOK, string(stubs.TransferRateResponse())) // Mock API response
client := New(WithBaseURL(server.URL))
// Act
rate, response, err := client.Transfers.Rate(context.Background(), 1000, "USD", "NGN")
// Assert
assert.Nil(t, err)
assert.NotNil(t, response)
assert.Equal(t, http.StatusOK, response.HTTPResponse.StatusCode)
// Unmarshal expected response for assertion
var expectedData TransferRateResponse
err = json.Unmarshal([]byte(stubs.TransferRateResponse()), &expectedData)
assert.Nil(t, err)
assert.Equal(t, expectedData, *rate) // Ensure response struct matches expected output
// Teardown
server.Close()
}
func TestTransfersService_Rate_Failure(t *testing.T) {
// Setup
t.Parallel()
// Arrange
errorResponse := `{"error": "internal server error"}`
server := helpers.MakeTestServer(http.StatusInternalServerError, errorResponse)
client := New(WithBaseURL(server.URL))
// Act
rate, response, err := client.Transfers.Rate(context.Background(), 1000, "USD", "NGN")
// Assert
assert.NotNil(t, err) // Expect an error
assert.Nil(t, rate) // The rate should be nil due to failure
assert.NotNil(t, response)
assert.Equal(t, http.StatusInternalServerError, response.HTTPResponse.StatusCode)
assert.Contains(t, err.Error(), "500") // Ensure error message contains 500
assert.Contains(t, err.Error(), "internal server error") // Ensure error message contains actual response error
// Teardown
server.Close()
}
func TestTransfersService_Rate_ErrCouldNotConstructNewRequest(t *testing.T) {
// Setup
t.Parallel()
// Arrange - Create a client with an invalid base URL
client := New(WithBaseURL("://invalid-url"))
// Act
rate, response, err := client.Transfers.Rate(context.Background(), 1000, "USD", "NGN")
// Assert
assert.Nil(t, rate)
assert.Nil(t, response)
assert.NotNil(t, err)
assert.True(t, errors.Is(err, ErrCouldNotConstructNewRequest), "Expected ErrCouldNotConstructNewRequest")
// Ensure error message contains relevant details
assert.Contains(t, err.Error(), "could not construct new request")
}
func TestTransfersService_Rate_ErrRequestFailure(t *testing.T) {
// Setup
t.Parallel()
// Arrange - Create a client pointing to a non-existent server
client := New(WithBaseURL("http://127.0.0.1:54321")) // Non-listening port
// Act
rate, response, err := client.Transfers.Rate(context.Background(), 1000, "USD", "NGN")
// Assert
assert.Nil(t, rate)
assert.Nil(t, response)
assert.NotNil(t, err)
assert.True(t, errors.Is(err, ErrRequestFailure), "Expected ErrRequestFailure")
assert.Contains(t, err.Error(), "request failed")
}
func TestTransfersService_Rate_ErrUnmarshalFailure(t *testing.T) {
// Setup
t.Parallel()
// Arrange - Return malformed JSON from mock server
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, `{invalid-json-response}`) // Malformed JSON
}))
defer server.Close()
client := New(WithBaseURL(server.URL))
// Act
rate, response, err := client.Transfers.Rate(context.Background(), 1000, "USD", "NGN")
// Assert
assert.Nil(t, rate)
assert.NotNil(t, response)
assert.NotNil(t, err)
assert.True(t, errors.Is(err, ErrUnmarshalFailure), "Expected ErrUnmarshalFailure")
assert.Contains(t, err.Error(), "failed to unmarshal response")
}