142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
import MockAdapter from 'axios-mock-adapter';
 | 
						|
import { ImporterStatus } from '~/importer_status';
 | 
						|
import axios from '~/lib/utils/axios_utils';
 | 
						|
 | 
						|
describe('Importer Status', () => {
 | 
						|
  let instance;
 | 
						|
  let mock;
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    mock = new MockAdapter(axios);
 | 
						|
  });
 | 
						|
 | 
						|
  afterEach(() => {
 | 
						|
    mock.restore();
 | 
						|
  });
 | 
						|
 | 
						|
  describe('addToImport', () => {
 | 
						|
    const importUrl = '/import_url';
 | 
						|
    const fixtures = `
 | 
						|
      <table>
 | 
						|
        <tr id="repo_123">
 | 
						|
          <td class="import-target"></td>
 | 
						|
          <td class="import-actions job-status">
 | 
						|
            <button name="button" type="submit" class="btn btn-import js-add-to-import">
 | 
						|
            </button>
 | 
						|
          </td>
 | 
						|
        </tr>
 | 
						|
      </table>
 | 
						|
    `;
 | 
						|
 | 
						|
    beforeEach(() => {
 | 
						|
      setFixtures(fixtures);
 | 
						|
      jest.spyOn(ImporterStatus.prototype, 'initStatusPage').mockImplementation(() => {});
 | 
						|
      jest.spyOn(ImporterStatus.prototype, 'setAutoUpdate').mockImplementation(() => {});
 | 
						|
      instance = new ImporterStatus({
 | 
						|
        jobsUrl: '',
 | 
						|
        importUrl,
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    it('sets table row to active after post request', done => {
 | 
						|
      mock.onPost(importUrl).reply(200, {
 | 
						|
        id: 1,
 | 
						|
        full_path: '/full_path',
 | 
						|
      });
 | 
						|
 | 
						|
      instance
 | 
						|
        .addToImport({
 | 
						|
          currentTarget: document.querySelector('.js-add-to-import'),
 | 
						|
        })
 | 
						|
        .then(() => {
 | 
						|
          expect(document.querySelector('tr').classList.contains('table-active')).toEqual(true);
 | 
						|
          done();
 | 
						|
        })
 | 
						|
        .catch(done.fail);
 | 
						|
    });
 | 
						|
 | 
						|
    it('shows error message after failed POST request', done => {
 | 
						|
      setFixtures(`${fixtures}<div class="flash-container"></div>`);
 | 
						|
 | 
						|
      mock.onPost(importUrl).reply(422, {
 | 
						|
        errors: 'You forgot your lunch',
 | 
						|
      });
 | 
						|
 | 
						|
      instance
 | 
						|
        .addToImport({
 | 
						|
          currentTarget: document.querySelector('.js-add-to-import'),
 | 
						|
        })
 | 
						|
        .then(() => {
 | 
						|
          const flashMessage = document.querySelector('.flash-text');
 | 
						|
 | 
						|
          expect(flashMessage.textContent.trim()).toEqual(
 | 
						|
            'An error occurred while importing project: You forgot your lunch',
 | 
						|
          );
 | 
						|
          done();
 | 
						|
        })
 | 
						|
        .catch(done.fail);
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe('autoUpdate', () => {
 | 
						|
    const jobsUrl = '/jobs_url';
 | 
						|
 | 
						|
    beforeEach(() => {
 | 
						|
      const div = document.createElement('div');
 | 
						|
      div.innerHTML = `
 | 
						|
        <div id="project_1">
 | 
						|
          <div class="job-status">
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      `;
 | 
						|
 | 
						|
      document.body.appendChild(div);
 | 
						|
 | 
						|
      jest.spyOn(ImporterStatus.prototype, 'initStatusPage').mockImplementation(() => {});
 | 
						|
      jest.spyOn(ImporterStatus.prototype, 'setAutoUpdate').mockImplementation(() => {});
 | 
						|
      instance = new ImporterStatus({
 | 
						|
        jobsUrl,
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    function setupMock(importStatus) {
 | 
						|
      mock.onGet(jobsUrl).reply(200, [
 | 
						|
        {
 | 
						|
          id: 1,
 | 
						|
          import_status: importStatus,
 | 
						|
        },
 | 
						|
      ]);
 | 
						|
    }
 | 
						|
 | 
						|
    function expectJobStatus(done, status) {
 | 
						|
      instance
 | 
						|
        .autoUpdate()
 | 
						|
        .then(() => {
 | 
						|
          expect(document.querySelector('#project_1').innerText.trim()).toEqual(status);
 | 
						|
          done();
 | 
						|
        })
 | 
						|
        .catch(done.fail);
 | 
						|
    }
 | 
						|
 | 
						|
    it('sets the job status to done', done => {
 | 
						|
      setupMock('finished');
 | 
						|
      expectJobStatus(done, 'Done');
 | 
						|
    });
 | 
						|
 | 
						|
    it('sets the job status to scheduled', done => {
 | 
						|
      setupMock('scheduled');
 | 
						|
      expectJobStatus(done, 'Scheduled');
 | 
						|
    });
 | 
						|
 | 
						|
    it('sets the job status to started', done => {
 | 
						|
      setupMock('started');
 | 
						|
      expectJobStatus(done, 'Started');
 | 
						|
    });
 | 
						|
 | 
						|
    it('sets the job status to custom status', done => {
 | 
						|
      setupMock('custom status');
 | 
						|
      expectJobStatus(done, 'custom status');
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |