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  }