137 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import Vue from 'vue';
 | |
| import VueApollo from 'vue-apollo';
 | |
| import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
 | |
| import TimelogSourceCell from '~/time_tracking/components/timelog_source_cell.vue';
 | |
| import {
 | |
|   issuableStatusText,
 | |
|   STATUS_CLOSED,
 | |
|   STATUS_MERGED,
 | |
|   STATUS_OPEN,
 | |
|   STATUS_LOCKED,
 | |
|   STATUS_REOPENED,
 | |
| } from '~/issues/constants';
 | |
| 
 | |
| const createIssuableTimelogMock = (
 | |
|   type,
 | |
|   { title, state, webUrl, reference } = {
 | |
|     title: 'Issuable title',
 | |
|     state: STATUS_OPEN,
 | |
|     webUrl: 'https://example.com/issuable_url',
 | |
|     reference: '#111',
 | |
|   },
 | |
| ) => {
 | |
|   return {
 | |
|     timelog: {
 | |
|       project: {
 | |
|         fullPath: 'group/project',
 | |
|       },
 | |
|       [type]: {
 | |
|         title,
 | |
|         state,
 | |
|         webUrl,
 | |
|         reference,
 | |
|       },
 | |
|     },
 | |
|   };
 | |
| };
 | |
| 
 | |
| describe('TimelogSourceCell component', () => {
 | |
|   Vue.use(VueApollo);
 | |
| 
 | |
|   let wrapper;
 | |
| 
 | |
|   const findTitleContainer = () => wrapper.findByTestId('title-container');
 | |
|   const findReferenceContainer = () => wrapper.findByTestId('reference-container');
 | |
|   const findStateContainer = () => wrapper.findByTestId('state-container');
 | |
| 
 | |
|   const mountComponent = ({ timelog } = {}) => {
 | |
|     wrapper = shallowMountExtended(TimelogSourceCell, {
 | |
|       propsData: {
 | |
|         timelog,
 | |
|       },
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   describe('when the timelog is associated to an issue', () => {
 | |
|     it('shows the issue title as link to the issue', () => {
 | |
|       mountComponent(
 | |
|         createIssuableTimelogMock('issue', {
 | |
|           title: 'Issue title',
 | |
|           webUrl: 'https://example.com/issue_url',
 | |
|         }),
 | |
|       );
 | |
| 
 | |
|       const titleContainer = findTitleContainer();
 | |
| 
 | |
|       expect(titleContainer.text()).toBe('Issue title');
 | |
|       expect(titleContainer.attributes('href')).toBe('https://example.com/issue_url');
 | |
|     });
 | |
| 
 | |
|     it('shows the issue full reference as link to the issue', () => {
 | |
|       mountComponent(
 | |
|         createIssuableTimelogMock('issue', {
 | |
|           reference: '#111',
 | |
|           webUrl: 'https://example.com/issue_url',
 | |
|         }),
 | |
|       );
 | |
| 
 | |
|       const referenceContainer = findReferenceContainer();
 | |
| 
 | |
|       expect(referenceContainer.text()).toBe('group/project#111');
 | |
|       expect(referenceContainer.attributes('href')).toBe('https://example.com/issue_url');
 | |
|     });
 | |
| 
 | |
|     it.each`
 | |
|       state              | stateDescription
 | |
|       ${STATUS_OPEN}     | ${issuableStatusText[STATUS_OPEN]}
 | |
|       ${STATUS_REOPENED} | ${issuableStatusText[STATUS_REOPENED]}
 | |
|       ${STATUS_LOCKED}   | ${issuableStatusText[STATUS_LOCKED]}
 | |
|       ${STATUS_CLOSED}   | ${issuableStatusText[STATUS_CLOSED]}
 | |
|     `('shows $stateDescription when the state is $state', ({ state, stateDescription }) => {
 | |
|       mountComponent(createIssuableTimelogMock('issue', { state }));
 | |
| 
 | |
|       expect(findStateContainer().text()).toBe(stateDescription);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('when the timelog is associated to a merge request', () => {
 | |
|     it('shows the merge request title as link to the merge request', () => {
 | |
|       mountComponent(
 | |
|         createIssuableTimelogMock('mergeRequest', {
 | |
|           title: 'MR title',
 | |
|           webUrl: 'https://example.com/mr_url',
 | |
|         }),
 | |
|       );
 | |
| 
 | |
|       const titleContainer = findTitleContainer();
 | |
| 
 | |
|       expect(titleContainer.text()).toBe('MR title');
 | |
|       expect(titleContainer.attributes('href')).toBe('https://example.com/mr_url');
 | |
|     });
 | |
| 
 | |
|     it('shows the merge request full reference as link to the merge request', () => {
 | |
|       mountComponent(
 | |
|         createIssuableTimelogMock('mergeRequest', {
 | |
|           reference: '!111',
 | |
|           webUrl: 'https://example.com/mr_url',
 | |
|         }),
 | |
|       );
 | |
| 
 | |
|       const referenceContainer = findReferenceContainer();
 | |
| 
 | |
|       expect(referenceContainer.text()).toBe('group/project!111');
 | |
|       expect(referenceContainer.attributes('href')).toBe('https://example.com/mr_url');
 | |
|     });
 | |
|     it.each`
 | |
|       state            | stateDescription
 | |
|       ${STATUS_OPEN}   | ${issuableStatusText[STATUS_OPEN]}
 | |
|       ${STATUS_CLOSED} | ${issuableStatusText[STATUS_CLOSED]}
 | |
|       ${STATUS_MERGED} | ${issuableStatusText[STATUS_MERGED]}
 | |
|     `('shows $stateDescription when the state is $state', ({ state, stateDescription }) => {
 | |
|       mountComponent(createIssuableTimelogMock('mergeRequest', { state }));
 | |
| 
 | |
|       expect(findStateContainer().text()).toBe(stateDescription);
 | |
|     });
 | |
|   });
 | |
| });
 |