github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cps/dv_challenges_test.go (about)

     1  package cps
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestGetChangeLetsEncryptChallenges(t *testing.T) {
    15  	tests := map[string]struct {
    16  		params           GetChangeRequest
    17  		responseStatus   int
    18  		responseBody     string
    19  		expectedPath     string
    20  		expectedResponse *DVArray
    21  		withError        func(*testing.T, error)
    22  	}{
    23  		"200 OK": {
    24  			params: GetChangeRequest{
    25  				EnrollmentID: 1,
    26  				ChangeID:     2,
    27  			},
    28  			responseStatus: http.StatusOK,
    29  			responseBody: `
    30  {
    31      "dv": [
    32          {
    33              "status": "Awaiting user",
    34              "error": "The domain is not ready for validation.",
    35              "validationStatus": "RESPONSE_ERROR",
    36              "requestTimestamp": "2018-09-05T15:55:49Z",
    37              "validatedTimestamp": "2018-09-05T17:53:22Z",
    38              "expires": "2018-09-06T17:55:17Z",
    39              "challenges": [
    40                  {
    41                      "type": "dns-01",
    42                      "status": "pending",
    43                      "error": null,
    44                      "token": "cGBnw-3YO7rUhq61EuuHqcGrYkaQWALAgi8szTqRoHA",
    45                      "responseBody": "0yVISDJjpXR7BXzR5QgfA51tt-I6aKremGnPwK_lvH4",
    46                      "fullPath": "_acme-challenge.www.cps-example-dv.com.",
    47                      "redirectFullPath": "",
    48                      "validationRecords": []
    49                  }
    50              ],
    51              "domain": "www.cps-example-dv.com"
    52          }
    53      ]
    54  }`,
    55  			expectedPath: "/cps/v2/enrollments/1/changes/2/input/info/lets-encrypt-challenges",
    56  			expectedResponse: &DVArray{DV: []DV{
    57  				{
    58  					Challenges: []Challenge{
    59  						{
    60  							FullPath:          "_acme-challenge.www.cps-example-dv.com.",
    61  							ResponseBody:      "0yVISDJjpXR7BXzR5QgfA51tt-I6aKremGnPwK_lvH4",
    62  							Status:            "pending",
    63  							Token:             "cGBnw-3YO7rUhq61EuuHqcGrYkaQWALAgi8szTqRoHA",
    64  							Type:              "dns-01",
    65  							ValidationRecords: []ValidationRecord{},
    66  						},
    67  					},
    68  					Domain:             "www.cps-example-dv.com",
    69  					Error:              "The domain is not ready for validation.",
    70  					Expires:            "2018-09-06T17:55:17Z",
    71  					RequestTimestamp:   "2018-09-05T15:55:49Z",
    72  					Status:             "Awaiting user",
    73  					ValidatedTimestamp: "2018-09-05T17:53:22Z",
    74  					ValidationStatus:   "RESPONSE_ERROR",
    75  				},
    76  			}},
    77  		},
    78  		"500 internal server error": {
    79  			params: GetChangeRequest{
    80  				EnrollmentID: 1,
    81  				ChangeID:     2,
    82  			},
    83  			responseStatus: http.StatusInternalServerError,
    84  			responseBody: `
    85  {
    86  	"type": "internal_error",
    87    "title": "Internal Server Error",
    88    "detail": "Error making request",
    89    "status": 500
    90  }`,
    91  			expectedPath: "/cps/v2/enrollments/1/changes/2/input/info/lets-encrypt-challenges",
    92  			withError: func(t *testing.T, err error) {
    93  				want := &Error{
    94  					Type:       "internal_error",
    95  					Title:      "Internal Server Error",
    96  					Detail:     "Error making request",
    97  					StatusCode: http.StatusInternalServerError,
    98  				}
    99  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
   100  			},
   101  		},
   102  		"validation error": {
   103  			params: GetChangeRequest{},
   104  			withError: func(t *testing.T, err error) {
   105  				assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err)
   106  			},
   107  		},
   108  	}
   109  	for name, test := range tests {
   110  		t.Run(name, func(t *testing.T) {
   111  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   112  				assert.Equal(t, test.expectedPath, r.URL.String())
   113  				assert.Equal(t, http.MethodGet, r.Method)
   114  				assert.Equal(t, "application/vnd.akamai.cps.dv-challenges.v2+json", r.Header.Get("Accept"))
   115  				w.WriteHeader(test.responseStatus)
   116  				_, err := w.Write([]byte(test.responseBody))
   117  				assert.NoError(t, err)
   118  			}))
   119  			client := mockAPIClient(t, mockServer)
   120  			result, err := client.GetChangeLetsEncryptChallenges(context.Background(), test.params)
   121  			if test.withError != nil {
   122  				test.withError(t, err)
   123  				return
   124  			}
   125  			require.NoError(t, err)
   126  			assert.Equal(t, test.expectedResponse, result)
   127  		})
   128  	}
   129  }
   130  
   131  func TestAcknowledgeDVChallenges(t *testing.T) {
   132  	tests := map[string]struct {
   133  		params           AcknowledgementRequest
   134  		responseStatus   int
   135  		responseBody     string
   136  		expectedPath     string
   137  		expectedResponse *DVArray
   138  		withError        func(*testing.T, error)
   139  	}{
   140  		"204 no content": {
   141  			params: AcknowledgementRequest{
   142  				EnrollmentID:    1,
   143  				ChangeID:        2,
   144  				Acknowledgement: Acknowledgement{"acknowledge"},
   145  			},
   146  			responseStatus: http.StatusNoContent,
   147  			expectedPath:   "/cps/v2/enrollments/1/changes/2/input/update/lets-encrypt-challenges-completed",
   148  		},
   149  		"500 internal server error": {
   150  			params: AcknowledgementRequest{
   151  				EnrollmentID:    1,
   152  				ChangeID:        2,
   153  				Acknowledgement: Acknowledgement{"acknowledge"},
   154  			},
   155  			responseStatus: http.StatusInternalServerError,
   156  			expectedPath:   "/cps/v2/enrollments/1/changes/2/input/update/lets-encrypt-challenges-completed",
   157  			responseBody: `
   158  {
   159    "type": "internal_error",
   160    "title": "Internal Server Error",
   161    "detail": "Error making request",
   162    "status": 500
   163  }`,
   164  			withError: func(t *testing.T, err error) {
   165  				want := &Error{
   166  					Type:       "internal_error",
   167  					Title:      "Internal Server Error",
   168  					Detail:     "Error making request",
   169  					StatusCode: http.StatusInternalServerError,
   170  				}
   171  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
   172  			},
   173  		},
   174  		"validation error": {
   175  			params: AcknowledgementRequest{},
   176  			withError: func(t *testing.T, err error) {
   177  				assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err)
   178  			},
   179  		},
   180  	}
   181  	for name, test := range tests {
   182  		t.Run(name, func(t *testing.T) {
   183  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   184  				assert.Equal(t, test.expectedPath, r.URL.String())
   185  				assert.Equal(t, http.MethodPost, r.Method)
   186  				assert.Equal(t, "application/vnd.akamai.cps.change-id.v1+json", r.Header.Get("Accept"))
   187  				assert.Equal(t, "application/vnd.akamai.cps.acknowledgement.v1+json; charset=utf-8", r.Header.Get("Content-Type"))
   188  				w.WriteHeader(test.responseStatus)
   189  				_, err := w.Write([]byte(test.responseBody))
   190  				require.NoError(t, err)
   191  			}))
   192  			client := mockAPIClient(t, mockServer)
   193  			err := client.AcknowledgeDVChallenges(context.Background(), test.params)
   194  			if test.withError != nil {
   195  				test.withError(t, err)
   196  				return
   197  			}
   198  			require.NoError(t, err)
   199  		})
   200  	}
   201  }