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  }