github.com/companieshouse/insolvency-api@v0.0.0-20231024103413-440c973d9e9b/service/transaction_service_test.go (about) 1 package service 2 3 import ( 4 "net/http" 5 "testing" 6 7 "github.com/companieshouse/insolvency-api/constants" 8 mock_dao "github.com/companieshouse/insolvency-api/mocks" 9 "github.com/companieshouse/insolvency-api/models" 10 "github.com/companieshouse/insolvency-api/transformers" 11 "github.com/companieshouse/insolvency-api/utils" 12 "github.com/golang/mock/gomock" 13 14 "github.com/jarcoal/httpmock" 15 16 . "github.com/smartystreets/goconvey/convey" 17 ) 18 19 func incomingInsolvencyResourceDao(helperService utils.HelperService) *models.InsolvencyResourceDao { 20 request := incomingInsolvencyRequest("01234567", "companyName", constants.CVL.String()) 21 22 res := transformers.InsolvencyResourceRequestToDB(request, "87654321", helperService) 23 return res 24 } 25 26 func transactionProfileResponse(status string) string { 27 return ` 28 { 29 "id": "87654321", 30 "company_name": "companyName", 31 "company_number": "01234567", 32 "status": "` + status + `" 33 } 34 ` 35 } 36 37 func TestUnitCheckTransactionID(t *testing.T) { 38 39 Convey("CheckTransactionIDFromTransactionAPI", t, func() { 40 41 apiURL := "https://api.companieshouse.gov.uk" 42 43 httpmock.Activate() 44 defer httpmock.DeactivateAndReset() 45 46 Convey("Transaction cannot be found on transaction api", func() { 47 defer httpmock.Reset() 48 49 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusNotFound, "Message: Transaction not found")) 50 51 err, statusCode := CheckTransactionID("87654321", &http.Request{}) 52 So(err, ShouldNotBeNil) 53 So(statusCode, ShouldEqual, http.StatusNotFound) 54 So(err.Error(), ShouldEqual, `transaction not found`) 55 }) 56 57 Convey("Error contacting the transaction api", func() { 58 defer httpmock.Reset() 59 60 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusTeapot, "")) 61 62 err, statusCode := CheckTransactionID("87654321", &http.Request{}) 63 So(err, ShouldNotBeNil) 64 So(statusCode, ShouldEqual, http.StatusTeapot) 65 So(err.Error(), ShouldEqual, `error communicating with the transaction api`) 66 }) 67 68 Convey("Provided transaction successfully returned", func() { 69 defer httpmock.Reset() 70 71 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusOK, transactionProfileResponse("open"))) 72 73 err, statusCode := CheckTransactionID("87654321", &http.Request{}) 74 75 So(err, ShouldBeNil) 76 So(statusCode, ShouldEqual, http.StatusOK) 77 }) 78 }) 79 } 80 81 func TestUnitPatchTransactionWithInsolvencyResource(t *testing.T) { 82 mockCtrl := gomock.NewController(t) 83 defer mockCtrl.Finish() 84 85 mockHelperService := mock_dao.NewHelperMockHelperService(mockCtrl) 86 87 Convey("PatchTransactionWithInsolvencyResourceOnTransactionAPI", t, func() { 88 89 privateApiURL := "http://localhost:4001" 90 91 httpmock.Activate() 92 defer httpmock.DeactivateAndReset() 93 94 Convey("Transaction cannot be found on transaction api", func() { 95 defer httpmock.Reset() 96 97 httpmock.RegisterResponder(http.MethodPatch, privateApiURL+"/private/transactions/87654321", httpmock.NewStringResponder(http.StatusNotFound, "Message: Transaction not found")) 98 99 mockHelperService.EXPECT().GenerateEtag().Return("etag", nil) 100 101 err, statusCode := PatchTransactionWithInsolvencyResource("87654321", incomingInsolvencyResourceDao(mockHelperService), &http.Request{}) 102 So(err, ShouldNotBeNil) 103 So(statusCode, ShouldEqual, http.StatusNotFound) 104 So(err.Error(), ShouldEqual, `transaction not found`) 105 }) 106 107 Convey("Error contacting the transaction api", func() { 108 defer httpmock.Reset() 109 110 httpmock.RegisterResponder(http.MethodPatch, privateApiURL+"/private/transactions/87654321", httpmock.NewStringResponder(http.StatusTeapot, "")) 111 112 mockHelperService.EXPECT().GenerateEtag().Return("etag", nil) 113 114 err, statusCode := PatchTransactionWithInsolvencyResource("87654321", incomingInsolvencyResourceDao(mockHelperService), &http.Request{}) 115 So(err, ShouldNotBeNil) 116 So(statusCode, ShouldEqual, http.StatusTeapot) 117 So(err.Error(), ShouldEqual, `error communication with the transaction api`) 118 }) 119 120 Convey("Provided transaction successfully patched", func() { 121 defer httpmock.Reset() 122 123 httpmock.RegisterResponder(http.MethodPatch, privateApiURL+"/private/transactions/87654321", httpmock.NewStringResponder(http.StatusOK, transactionProfileResponse("open"))) 124 125 mockHelperService.EXPECT().GenerateEtag().Return("etag", nil) 126 127 err, statusCode := PatchTransactionWithInsolvencyResource("87654321", incomingInsolvencyResourceDao(mockHelperService), &http.Request{}) 128 129 So(err, ShouldBeNil) 130 So(statusCode, ShouldEqual, http.StatusOK) 131 }) 132 }) 133 } 134 135 func TestUnitCheckIfTransactionClosed(t *testing.T) { 136 137 Convey("CheckIfTransactionClosed", t, func() { 138 139 apiURL := "https://api.companieshouse.gov.uk" 140 141 httpmock.Activate() 142 defer httpmock.DeactivateAndReset() 143 144 Convey("Transaction cannot be found on transaction api", func() { 145 defer httpmock.Reset() 146 147 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusNotFound, "Message: Transaction not found")) 148 149 _, err, statusCode := CheckIfTransactionClosed("87654321", &http.Request{}) 150 So(err, ShouldNotBeNil) 151 So(statusCode, ShouldEqual, http.StatusNotFound) 152 So(err.Error(), ShouldEqual, `transaction not found`) 153 }) 154 155 Convey("Error contacting the transaction api", func() { 156 defer httpmock.Reset() 157 158 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusTeapot, "")) 159 160 _, err, statusCode := CheckIfTransactionClosed("87654321", &http.Request{}) 161 So(err, ShouldNotBeNil) 162 So(statusCode, ShouldEqual, http.StatusTeapot) 163 So(err.Error(), ShouldContainSubstring, `error getting transaction from transaction api`) 164 }) 165 166 Convey("Provided transaction successfully returned as a closed transaction", func() { 167 defer httpmock.Reset() 168 169 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusOK, transactionProfileResponse("closed"))) 170 171 isTransactionClosed, err, statusCode := CheckIfTransactionClosed("87654321", &http.Request{}) 172 173 So(isTransactionClosed, ShouldBeTrue) 174 So(err, ShouldBeNil) 175 So(statusCode, ShouldEqual, http.StatusForbidden) 176 }) 177 178 Convey("Provided transaction successfully returned as an open transaction", func() { 179 defer httpmock.Reset() 180 181 httpmock.RegisterResponder(http.MethodGet, apiURL+"/transactions/87654321", httpmock.NewStringResponder(http.StatusOK, transactionProfileResponse("open"))) 182 183 isTransactionClosed, err, statusCode := CheckIfTransactionClosed("87654321", &http.Request{}) 184 185 So(isTransactionClosed, ShouldBeFalse) 186 So(err, ShouldBeNil) 187 So(statusCode, ShouldEqual, http.StatusOK) 188 }) 189 }) 190 }