Test Setup Failed
Push — main ( 2b959f...bb41a6 )
by Acho
59s queued 15s
created

Service_Rate_ErrRequestFailure   A

Complexity

Conditions 1

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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