integration_settings_form_spec.js 9.2 KB
Newer Older
1
import $ from 'jquery';
2 3
import MockAdaptor from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
4 5 6
import IntegrationSettingsForm from '~/integrations/integration_settings_form';

describe('IntegrationSettingsForm', () => {
7
  const FIXTURE = 'services/edit_service.html';
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  preloadFixtures(FIXTURE);

  beforeEach(() => {
    loadFixtures(FIXTURE);
  });

  describe('contructor', () => {
    let integrationSettingsForm;

    beforeEach(() => {
      integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
      spyOn(integrationSettingsForm, 'init');
    });

    it('should initialize form element refs on class object', () => {
      // Form Reference
      expect(integrationSettingsForm.$form).toBeDefined();
      expect(integrationSettingsForm.$form.prop('nodeName')).toEqual('FORM');
26
      expect(integrationSettingsForm.formActive).toBeDefined();
27 28 29 30 31 32 33 34

      // Form Child Elements
      expect(integrationSettingsForm.$submitBtn).toBeDefined();
      expect(integrationSettingsForm.$submitBtnLoader).toBeDefined();
      expect(integrationSettingsForm.$submitBtnLabel).toBeDefined();
    });

    it('should initialize form metadata on class object', () => {
35
      expect(integrationSettingsForm.testEndPoint).toBeDefined();
36 37 38 39 40 41 42 43 44 45 46 47
      expect(integrationSettingsForm.canTestService).toBeDefined();
    });
  });

  describe('toggleServiceState', () => {
    let integrationSettingsForm;

    beforeEach(() => {
      integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
    });

    it('should remove `novalidate` attribute to form when called with `true`', () => {
48 49
      integrationSettingsForm.formActive = true;
      integrationSettingsForm.toggleServiceState();
50 51 52 53 54

      expect(integrationSettingsForm.$form.attr('novalidate')).not.toBeDefined();
    });

    it('should set `novalidate` attribute to form when called with `false`', () => {
55 56
      integrationSettingsForm.formActive = false;
      integrationSettingsForm.toggleServiceState();
57 58 59 60 61 62 63 64 65 66 67 68 69

      expect(integrationSettingsForm.$form.attr('novalidate')).toBeDefined();
    });
  });

  describe('toggleSubmitBtnLabel', () => {
    let integrationSettingsForm;

    beforeEach(() => {
      integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
    });

    it('should set Save button label to "Test settings and save changes" when serviceActive & canTestService are `true`', () => {
70
      integrationSettingsForm.canTestService = true;
71
      integrationSettingsForm.formActive = true;
72

73
      integrationSettingsForm.toggleSubmitBtnLabel();
74

M
Mike Greiling 已提交
75 76 77
      expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual(
        'Test settings and save changes',
      );
78 79 80
    });

    it('should set Save button label to "Save changes" when either serviceActive or canTestService (or both) is `false`', () => {
81
      integrationSettingsForm.canTestService = false;
82
      integrationSettingsForm.formActive = false;
83

84
      integrationSettingsForm.toggleSubmitBtnLabel();
85

86 87
      expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Save changes');

88 89 90
      integrationSettingsForm.formActive = true;

      integrationSettingsForm.toggleSubmitBtnLabel();
91

92 93
      expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Save changes');

94
      integrationSettingsForm.canTestService = true;
95
      integrationSettingsForm.formActive = false;
96

97
      integrationSettingsForm.toggleSubmitBtnLabel();
98

99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
      expect(integrationSettingsForm.$submitBtnLabel.text()).toEqual('Save changes');
    });
  });

  describe('toggleSubmitBtnState', () => {
    let integrationSettingsForm;

    beforeEach(() => {
      integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
    });

    it('should disable Save button and show loader animation when called with `true`', () => {
      integrationSettingsForm.toggleSubmitBtnState(true);

      expect(integrationSettingsForm.$submitBtn.is(':disabled')).toBeTruthy();
      expect(integrationSettingsForm.$submitBtnLoader.hasClass('hidden')).toBeFalsy();
    });

    it('should enable Save button and hide loader animation when called with `false`', () => {
      integrationSettingsForm.toggleSubmitBtnState(false);

      expect(integrationSettingsForm.$submitBtn.is(':disabled')).toBeFalsy();
      expect(integrationSettingsForm.$submitBtnLoader.hasClass('hidden')).toBeTruthy();
    });
  });

  describe('testSettings', () => {
    let integrationSettingsForm;
    let formData;
128
    let mock;
129 130

    beforeEach(() => {
131 132 133 134
      mock = new MockAdaptor(axios);

      spyOn(axios, 'put').and.callThrough();

135
      integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
136
      // eslint-disable-next-line no-jquery/no-serialize
137 138 139
      formData = integrationSettingsForm.$form.serialize();
    });

140 141 142
    afterEach(() => {
      mock.restore();
    });
143

M
Mike Greiling 已提交
144 145 146
    it('should make an ajax request with provided `formData`', done => {
      integrationSettingsForm
        .testSettings(formData)
147 148
        .then(() => {
          expect(axios.put).toHaveBeenCalledWith(integrationSettingsForm.testEndPoint, formData);
149

150 151 152
          done();
        })
        .catch(done.fail);
153 154
    });

M
Mike Greiling 已提交
155
    it('should show error Flash with `Save anyway` action if ajax request responds with error in test', done => {
156
      const errorMessage = 'Test failed.';
157 158 159 160
      mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
        error: true,
        message: errorMessage,
        service_response: 'some error',
161
        test_failed: true,
162
      });
163

M
Mike Greiling 已提交
164 165
      integrationSettingsForm
        .testSettings(formData)
166 167
        .then(() => {
          const $flashContainer = $('.flash-container');
168

M
Mike Greiling 已提交
169 170 171 172 173 174
          expect(
            $flashContainer
              .find('.flash-text')
              .text()
              .trim(),
          ).toEqual('Test failed. some error');
M
Mike Greiling 已提交
175

176
          expect($flashContainer.find('.flash-action')).toBeDefined();
M
Mike Greiling 已提交
177 178 179 180 181 182
          expect(
            $flashContainer
              .find('.flash-action')
              .text()
              .trim(),
          ).toEqual('Save anyway');
183

184 185 186
          done();
        })
        .catch(done.fail);
187 188
    });

M
Mike Greiling 已提交
189
    it('should not show error Flash with `Save anyway` action if ajax request responds with error in validation', done => {
190 191 192 193 194 195 196 197
      const errorMessage = 'Validations failed.';
      mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
        error: true,
        message: errorMessage,
        service_response: 'some error',
        test_failed: false,
      });

M
Mike Greiling 已提交
198 199
      integrationSettingsForm
        .testSettings(formData)
200 201
        .then(() => {
          const $flashContainer = $('.flash-container');
202

M
Mike Greiling 已提交
203 204 205 206 207 208
          expect(
            $flashContainer
              .find('.flash-text')
              .text()
              .trim(),
          ).toEqual('Validations failed. some error');
M
Mike Greiling 已提交
209

210
          expect($flashContainer.find('.flash-action')).toBeDefined();
M
Mike Greiling 已提交
211 212 213 214 215 216
          expect(
            $flashContainer
              .find('.flash-action')
              .text()
              .trim(),
          ).toEqual('');
217 218 219 220 221 222

          done();
        })
        .catch(done.fail);
    });

M
Mike Greiling 已提交
223
    it('should submit form if ajax request responds without any error in test', done => {
224
      spyOn(integrationSettingsForm.$form, 'submit');
225

226 227 228
      mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
        error: false,
      });
229

M
Mike Greiling 已提交
230 231
      integrationSettingsForm
        .testSettings(formData)
232 233
        .then(() => {
          expect(integrationSettingsForm.$form.submit).toHaveBeenCalled();
234

235 236 237
          done();
        })
        .catch(done.fail);
238 239
    });

M
Mike Greiling 已提交
240
    it('should submit form when clicked on `Save anyway` action of error Flash', done => {
241
      spyOn(integrationSettingsForm.$form, 'submit');
242

243 244 245 246
      const errorMessage = 'Test failed.';
      mock.onPut(integrationSettingsForm.testEndPoint).reply(200, {
        error: true,
        message: errorMessage,
247
        test_failed: true,
248
      });
249

M
Mike Greiling 已提交
250 251
      integrationSettingsForm
        .testSettings(formData)
252 253
        .then(() => {
          const $flashAction = $('.flash-container .flash-action');
254

255
          expect($flashAction).toBeDefined();
256

257 258 259 260
          $flashAction.get(0).click();
        })
        .then(() => {
          expect(integrationSettingsForm.$form.submit).toHaveBeenCalled();
261

262 263 264
          done();
        })
        .catch(done.fail);
265 266
    });

M
Mike Greiling 已提交
267
    it('should show error Flash if ajax request failed', done => {
268 269
      const errorMessage = 'Something went wrong on our end.';

270
      mock.onPut(integrationSettingsForm.testEndPoint).networkError();
271

M
Mike Greiling 已提交
272 273
      integrationSettingsForm
        .testSettings(formData)
274
        .then(() => {
M
Mike Greiling 已提交
275 276 277 278 279
          expect(
            $('.flash-container .flash-text')
              .text()
              .trim(),
          ).toEqual(errorMessage);
280

281 282 283
          done();
        })
        .catch(done.fail);
284 285
    });

M
Mike Greiling 已提交
286
    it('should always call `toggleSubmitBtnState` with `false` once request is completed', done => {
287
      mock.onPut(integrationSettingsForm.testEndPoint).networkError();
288 289 290

      spyOn(integrationSettingsForm, 'toggleSubmitBtnState');

M
Mike Greiling 已提交
291 292
      integrationSettingsForm
        .testSettings(formData)
293 294 295 296 297 298
        .then(() => {
          expect(integrationSettingsForm.toggleSubmitBtnState).toHaveBeenCalledWith(false);

          done();
        })
        .catch(done.fail);
299 300 301
    });
  });
});