// getResponseForCredentialsRequestWithParameters queries credentials for the
// given id. The getCredentials function is used to simulate getting the
// credentials object from the CredentialsManager
func getResponseForCredentialsRequestWithParameters(t *testing.T, expectedStatus int,
	expectedErrorMessage *errorMessage, id string, getCredentials func() (*credentials.TaskIAMRoleCredentials, bool)) (*bytes.Buffer, error) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()
	credentialsManager := mock_credentials.NewMockManager(ctrl)
	auditLog := mock_audit.NewMockAuditLogger(ctrl)
	server := setupServer(credentialsManager, auditLog)
	recorder := httptest.NewRecorder()

	creds, ok := getCredentials()
	credentialsManager.EXPECT().GetTaskCredentials(gomock.Any()).Return(creds, ok)
	auditLog.EXPECT().Log(gomock.Any(), gomock.Any(), gomock.Any())

	params := make(url.Values)
	params[credentials.CredentialsIdQueryParameterName] = []string{credentialsId}

	req, _ := http.NewRequest("GET", credentials.CredentialsPath+"?"+params.Encode(), nil)
	server.Handler.ServeHTTP(recorder, req)

	if recorder.Code != expectedStatus {
		return nil, fmt.Errorf("Expected return code: %d. Got: %d", expectedStatus, recorder.Code)
	}

	if recorder.Code != http.StatusOK {
		errorMessage := &errorMessage{}
		json.Unmarshal(recorder.Body.Bytes(), errorMessage)

		if errorMessage.Code != expectedErrorMessage.Code || errorMessage.Message != expectedErrorMessage.Message {
			return nil, fmt.Errorf("Unexpected values. Actual: %v| Expected: %v", errorMessage, expectedErrorMessage)
		}
	}

	return recorder.Body, nil
}
func testErrorResponsesFromServer(t *testing.T, path string, expectedErrorMessage *errorMessage) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	credentialsManager := mock_credentials.NewMockManager(ctrl)
	auditLog := mock_audit.NewMockAuditLogger(ctrl)
	server := setupServer(credentialsManager, auditLog)

	recorder := httptest.NewRecorder()
	req, _ := http.NewRequest("GET", path, nil)
	if path == credentials.CredentialsPath {
		auditLog.EXPECT().Log(gomock.Any(), gomock.Any(), gomock.Any())
	}

	server.Handler.ServeHTTP(recorder, req)
	httpErrorCode := http.StatusNotFound
	if expectedErrorMessage != nil {
		httpErrorCode = expectedErrorMessage.httpErrorCode
	}
	if recorder.Code != httpErrorCode {
		t.Fatalf("Expected return code: %d. Got: %d", httpErrorCode, recorder.Code)
	}

	// Only paths that are equal to /v1/credentials will return valid error responses.
	if path == credentials.CredentialsPath {
		errorMessage := &errorMessage{}
		json.Unmarshal(recorder.Body.Bytes(), errorMessage)
		if errorMessage.Code != expectedErrorMessage.Code ||
			errorMessage.Message != expectedErrorMessage.Message {
			t.Fatalf("Unexpected values. Actual: %v| Expected: %v", errorMessage, expectedErrorMessage)
		}
	}
}