github.com/companieshouse/insolvency-api@v0.0.0-20231024103413-440c973d9e9b/service/resolution_service_test.go (about) 1 package service 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 "testing" 8 "time" 9 10 "github.com/companieshouse/insolvency-api/mocks" 11 "github.com/companieshouse/insolvency-api/models" 12 "github.com/golang/mock/gomock" 13 "github.com/jarcoal/httpmock" 14 . "github.com/smartystreets/goconvey/convey" 15 ) 16 17 func TestUnitIsValidResolutionRequest(t *testing.T) { 18 Convey("Resolution request supplied is invalid - no attachment has been supplied", t, func() { 19 resolution := generateResolution() 20 resolution.Attachments = []string{} 21 22 err := ValidateResolutionRequest(resolution) 23 24 So(err, ShouldNotBeBlank) 25 So(err, ShouldContainSubstring, "please supply only one attachment") 26 }) 27 28 Convey("Resolution request supplied is invalid - more than one attachment has been supplied", t, func() { 29 resolution := generateResolution() 30 resolution.Attachments = []string{ 31 "1234567890", 32 "0987654321", 33 } 34 35 err := ValidateResolutionRequest(resolution) 36 37 So(err, ShouldNotBeBlank) 38 So(err, ShouldContainSubstring, "please supply only one attachment") 39 }) 40 } 41 42 func TestUnitIsValidResolutionDate(t *testing.T) { 43 transactionID := "123" 44 apiURL := "https://api.companieshouse.gov.uk" 45 46 httpmock.Activate() 47 defer httpmock.DeactivateAndReset() 48 49 Convey("error retrieving insolvency resource", t, func() { 50 mockCtrl := gomock.NewController(t) 51 defer mockCtrl.Finish() 52 53 mockService := mocks.NewMockService(mockCtrl) 54 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(models.InsolvencyResourceDao{}, fmt.Errorf("err")) 55 56 resolution := generateResolutionDao() 57 58 req := httptest.NewRequest(http.MethodGet, "/", nil) 59 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 60 So(err.Error(), ShouldContainSubstring, "err") 61 So(validationErr, ShouldBeEmpty) 62 }) 63 64 Convey("error retrieving company details", t, func() { 65 mockCtrl := gomock.NewController(t) 66 defer mockCtrl.Finish() 67 68 defer httpmock.Reset() 69 httpmock.RegisterResponder(http.MethodGet, apiURL+"/company/1234", httpmock.NewStringResponder(http.StatusTeapot, "")) 70 71 mockService := mocks.NewMockService(mockCtrl) 72 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(generateInsolvencyResource(), nil) 73 74 resolution := generateResolutionDao() 75 req := httptest.NewRequest(http.MethodGet, "/", nil) 76 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 77 So(validationErr, ShouldBeEmpty) 78 So(err.Error(), ShouldContainSubstring, "error getting company details from DB") 79 }) 80 81 Convey("error parsing appointedOn date", t, func() { 82 mockCtrl := gomock.NewController(t) 83 defer mockCtrl.Finish() 84 85 defer httpmock.Reset() 86 httpmock.RegisterResponder(http.MethodGet, apiURL+"/company/1234", httpmock.NewStringResponder(http.StatusOK, companyProfileDateResponse("2000-06-26 00:00:00.000Z"))) 87 88 mockService := mocks.NewMockService(mockCtrl) 89 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(generateInsolvencyResource(), nil) 90 91 resolution := generateResolutionDao() 92 resolution.DateOfResolution = "2001/1/2" 93 94 req := httptest.NewRequest(http.MethodGet, "/", nil) 95 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 96 So(validationErr, ShouldBeEmpty) 97 So(err.Error(), ShouldContainSubstring, "error parsing date") 98 }) 99 100 Convey("error parsing incorporatedOn date", t, func() { 101 mockCtrl := gomock.NewController(t) 102 defer mockCtrl.Finish() 103 104 defer httpmock.Reset() 105 httpmock.RegisterResponder(http.MethodGet, apiURL+"/company/1234", httpmock.NewStringResponder(http.StatusOK, companyProfileDateResponse("error"))) 106 107 resolution := generateResolutionDao() 108 mockService := mocks.NewMockService(mockCtrl) 109 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(generateInsolvencyResource(), nil) 110 111 req := httptest.NewRequest(http.MethodGet, "/", nil) 112 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 113 So(validationErr, ShouldBeEmpty) 114 So(err.Error(), ShouldContainSubstring, "error parsing date") 115 }) 116 117 Convey("invalid date - in the future", t, func() { 118 mockCtrl := gomock.NewController(t) 119 defer mockCtrl.Finish() 120 121 defer httpmock.Reset() 122 httpmock.RegisterResponder(http.MethodGet, apiURL+"/company/1234", httpmock.NewStringResponder(http.StatusOK, companyProfileDateResponse("2000-06-26 00:00:00.000Z"))) 123 124 mockService := mocks.NewMockService(mockCtrl) 125 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(generateInsolvencyResource(), nil) 126 127 resolution := generateResolutionDao() 128 resolution.DateOfResolution = time.Now().AddDate(0, 0, 1).Format("2006-01-02") 129 130 req := httptest.NewRequest(http.MethodGet, "/", nil) 131 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 132 So(validationErr, ShouldContainSubstring, "should not be in the future") 133 So(err, ShouldBeNil) 134 }) 135 136 Convey("invalid appointedOn date - before company was incorporated", t, func() { 137 mockCtrl := gomock.NewController(t) 138 defer mockCtrl.Finish() 139 140 defer httpmock.Reset() 141 httpmock.RegisterResponder(http.MethodGet, apiURL+"/company/1234", httpmock.NewStringResponder(http.StatusOK, companyProfileDateResponse("2000-06-26 00:00:00.000Z"))) 142 143 mockService := mocks.NewMockService(mockCtrl) 144 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(generateInsolvencyResource(), nil) 145 146 resolution := generateResolutionDao() 147 resolution.DateOfResolution = "1999-01-01" 148 149 req := httptest.NewRequest(http.MethodGet, "/", nil) 150 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 151 So(validationErr, ShouldContainSubstring, "before the company was incorporated") 152 So(err, ShouldBeNil) 153 }) 154 155 Convey("valid date", t, func() { 156 mockCtrl := gomock.NewController(t) 157 defer mockCtrl.Finish() 158 159 defer httpmock.Reset() 160 httpmock.RegisterResponder(http.MethodGet, apiURL+"/company/1234", httpmock.NewStringResponder(http.StatusOK, companyProfileDateResponse("2000-06-26 00:00:00.000Z"))) 161 162 mockService := mocks.NewMockService(mockCtrl) 163 mockService.EXPECT().GetInsolvencyResource(transactionID).Return(generateInsolvencyResource(), nil) 164 165 resolution := generateResolutionDao() 166 167 req := httptest.NewRequest(http.MethodGet, "/", nil) 168 validationErr, err := ValidateResolutionDate(mockService, &resolution, transactionID, req) 169 So(validationErr, ShouldBeEmpty) 170 So(err, ShouldBeNil) 171 }) 172 173 } 174 175 func generateResolution() models.Resolution { 176 return models.Resolution{ 177 DateOfResolution: "2012-01-23", 178 Attachments: []string{ 179 "123456789", 180 }, 181 } 182 } 183 184 func generateResolutionDao() models.ResolutionResourceDao { 185 return models.ResolutionResourceDao{ 186 DateOfResolution: "2012-01-23", 187 Attachments: []string{ 188 "123456789", 189 }, 190 } 191 }