2021-03-08 18:12:59 +05:30
import { getByTestId , fireEvent } from '@testing-library/dom' ;
2021-03-11 19:13:27 +05:30
import { shallowMount , createLocalVue } from '@vue/test-utils' ;
2021-01-29 00:20:46 +05:30
import Vuex from 'vuex' ;
import DiffRow from '~/diffs/components/diff_row.vue' ;
2021-03-08 18:12:59 +05:30
import { mapParallel } from '~/diffs/components/diff_row_utils' ;
2021-03-11 19:13:27 +05:30
import diffsModule from '~/diffs/store/modules' ;
2021-04-29 21:17:54 +05:30
import { findInteropAttributes } from '../find_interop_attributes' ;
2021-03-11 19:13:27 +05:30
import diffFileMockData from '../mock_data/diff_file' ;
2021-01-29 00:20:46 +05:30
describe ( 'DiffRow' , ( ) => {
const testLines = [
{
left : { old _line : 1 , discussions : [ ] } ,
right : { new _line : 1 , discussions : [ ] } ,
hasDiscussionsLeft : true ,
hasDiscussionsRight : true ,
} ,
{
left : { } ,
right : { } ,
isMatchLineLeft : true ,
isMatchLineRight : true ,
} ,
{ } ,
{
left : { old _line : 1 , discussions : [ ] } ,
right : { new _line : 1 , discussions : [ ] } ,
} ,
] ;
const createWrapper = ( { props , state , isLoggedIn = true } ) => {
const localVue = createLocalVue ( ) ;
localVue . use ( Vuex ) ;
const diffs = diffsModule ( ) ;
diffs . state = { ... diffs . state , ... state } ;
const getters = { isLoggedIn : ( ) => isLoggedIn } ;
const store = new Vuex . Store ( {
modules : { diffs } ,
getters ,
} ) ;
const propsData = {
fileHash : 'abc' ,
filePath : 'abc' ,
line : { } ,
2021-03-08 18:12:59 +05:30
index : 0 ,
2021-01-29 00:20:46 +05:30
... props ,
} ;
2021-03-08 18:12:59 +05:30
const provide = {
glFeatures : { dragCommentSelection : true } ,
} ;
return shallowMount ( DiffRow , { propsData , localVue , store , provide } ) ;
} ;
2021-01-29 00:20:46 +05:30
it ( 'isHighlighted returns true given line.left' , ( ) => {
const props = {
line : {
left : {
line _code : 'abc' ,
} ,
} ,
} ;
const state = { highlightedRow : 'abc' } ;
const wrapper = createWrapper ( { props , state } ) ;
expect ( wrapper . vm . isHighlighted ) . toBe ( true ) ;
} ) ;
it ( 'isHighlighted returns true given line.right' , ( ) => {
const props = {
line : {
right : {
line _code : 'abc' ,
} ,
} ,
} ;
const state = { highlightedRow : 'abc' } ;
const wrapper = createWrapper ( { props , state } ) ;
expect ( wrapper . vm . isHighlighted ) . toBe ( true ) ;
} ) ;
it ( 'isHighlighted returns false given line.left' , ( ) => {
const props = {
line : {
left : {
line _code : 'abc' ,
} ,
} ,
} ;
const wrapper = createWrapper ( { props } ) ;
expect ( wrapper . vm . isHighlighted ) . toBe ( false ) ;
} ) ;
describe . each `
side
$ { 'left' }
$ { 'right' }
` (' $ side side', ({ side }) => {
it ( ` renders empty cells if ${ side } is unavailable ` , ( ) => {
2021-02-22 17:27:13 +05:30
const wrapper = createWrapper ( { props : { line : testLines [ 2 ] , inline : false } } ) ;
2021-01-29 00:20:46 +05:30
expect ( wrapper . find ( ` [data-testid=" ${ side } LineNumber"] ` ) . exists ( ) ) . toBe ( false ) ;
expect ( wrapper . find ( ` [data-testid=" ${ side } EmptyCell"] ` ) . exists ( ) ) . toBe ( true ) ;
} ) ;
it ( 'renders comment button' , ( ) => {
2021-02-22 17:27:13 +05:30
const wrapper = createWrapper ( { props : { line : testLines [ 3 ] , inline : false } } ) ;
2021-01-29 00:20:46 +05:30
expect ( wrapper . find ( ` [data-testid=" ${ side } CommentButton"] ` ) . exists ( ) ) . toBe ( true ) ;
} ) ;
it ( 'renders avatars' , ( ) => {
2021-02-22 17:27:13 +05:30
const wrapper = createWrapper ( { props : { line : testLines [ 0 ] , inline : false } } ) ;
2021-01-29 00:20:46 +05:30
expect ( wrapper . find ( ` [data-testid=" ${ side } Discussions"] ` ) . exists ( ) ) . toBe ( true ) ;
} ) ;
} ) ;
it ( 'renders left line numbers' , ( ) => {
const wrapper = createWrapper ( { props : { line : testLines [ 0 ] } } ) ;
const lineNumber = testLines [ 0 ] . left . old _line ;
expect ( wrapper . find ( ` [data-linenumber=" ${ lineNumber } "] ` ) . exists ( ) ) . toBe ( true ) ;
} ) ;
it ( 'renders right line numbers' , ( ) => {
const wrapper = createWrapper ( { props : { line : testLines [ 0 ] } } ) ;
const lineNumber = testLines [ 0 ] . right . new _line ;
expect ( wrapper . find ( ` [data-linenumber=" ${ lineNumber } "] ` ) . exists ( ) ) . toBe ( true ) ;
} ) ;
2021-03-08 18:12:59 +05:30
describe ( 'drag operations' , ( ) => {
let line ;
beforeEach ( ( ) => {
line = { ... testLines [ 0 ] } ;
} ) ;
it . each `
side
$ { 'left' }
$ { 'right' }
` ('emits ` enterdragging ` onDragEnter $ side side', ({ side }) => {
const expectation = { ... line [ side ] , index : 0 } ;
const wrapper = createWrapper ( { props : { line } } ) ;
fireEvent . dragEnter ( getByTestId ( wrapper . element , ` ${ side } -side ` ) ) ;
expect ( wrapper . emitted ( ) . enterdragging ) . toBeTruthy ( ) ;
expect ( wrapper . emitted ( ) . enterdragging [ 0 ] ) . toEqual ( [ expectation ] ) ;
} ) ;
it . each `
side
$ { 'left' }
$ { 'right' }
` ('emits ` stopdragging ` onDrop $ side side', ({ side }) => {
const wrapper = createWrapper ( { props : { line } } ) ;
fireEvent . dragEnd ( getByTestId ( wrapper . element , ` ${ side } -side ` ) ) ;
expect ( wrapper . emitted ( ) . stopdragging ) . toBeTruthy ( ) ;
} ) ;
} ) ;
describe ( 'sets coverage title and class' , ( ) => {
const thisLine = diffFileMockData . parallel _diff _lines [ 2 ] ;
const rightLine = diffFileMockData . parallel _diff _lines [ 2 ] . right ;
const mockDiffContent = {
diffFile : diffFileMockData ,
shouldRenderDraftRow : jest . fn ( ) ,
hasParallelDraftLeft : jest . fn ( ) ,
hasParallelDraftRight : jest . fn ( ) ,
draftForLine : jest . fn ( ) ,
} ;
const applyMap = mapParallel ( mockDiffContent ) ;
const props = {
line : applyMap ( thisLine ) ,
fileHash : diffFileMockData . file _hash ,
filePath : diffFileMockData . file _path ,
contextLinesPath : 'contextLinesPath' ,
isHighlighted : false ,
} ;
const name = diffFileMockData . file _path ;
const line = rightLine . new _line ;
it ( 'for lines with coverage' , ( ) => {
const coverageFiles = { files : { [ name ] : { [ line ] : 5 } } } ;
const wrapper = createWrapper ( { props , state : { coverageFiles } } ) ;
const coverage = wrapper . find ( '.line-coverage.right-side' ) ;
expect ( coverage . attributes ( 'title' ) ) . toContain ( 'Test coverage: 5 hits' ) ;
expect ( coverage . classes ( 'coverage' ) ) . toBeTruthy ( ) ;
} ) ;
it ( 'for lines without coverage' , ( ) => {
const coverageFiles = { files : { [ name ] : { [ line ] : 0 } } } ;
const wrapper = createWrapper ( { props , state : { coverageFiles } } ) ;
const coverage = wrapper . find ( '.line-coverage.right-side' ) ;
expect ( coverage . attributes ( 'title' ) ) . toContain ( 'No test coverage' ) ;
expect ( coverage . classes ( 'no-coverage' ) ) . toBeTruthy ( ) ;
} ) ;
it ( 'for unknown lines' , ( ) => {
const coverageFiles = { } ;
const wrapper = createWrapper ( { props , state : { coverageFiles } } ) ;
const coverage = wrapper . find ( '.line-coverage.right-side' ) ;
expect ( coverage . attributes ( 'title' ) ) . toBeFalsy ( ) ;
expect ( coverage . classes ( 'coverage' ) ) . toBeFalsy ( ) ;
expect ( coverage . classes ( 'no-coverage' ) ) . toBeFalsy ( ) ;
} ) ;
} ) ;
2021-04-29 21:17:54 +05:30
describe ( 'interoperability' , ( ) => {
it . each `
desc | line | inline | leftSide | rightSide
$ { 'with inline and new_line' } | $ { { left : { old _line : 3 , new _line : 5 , type : 'new' } } } | $ { true } | $ { { type : 'new' , line : '5' , oldLine : '3' , newLine : '5' } } | $ { null }
$ { 'with inline and no new_line' } | $ { { left : { old _line : 3 , type : 'old' } } } | $ { true } | $ { { type : 'old' , line : '3' , oldLine : '3' } } | $ { null }
$ { 'with parallel and no right side' } | $ { { left : { old _line : 3 , new _line : 5 } } } | $ { false } | $ { { type : 'old' , line : '3' , oldLine : '3' } } | $ { null }
$ { 'with parallel and no left side' } | $ { { right : { old _line : 3 , new _line : 5 } } } | $ { false } | $ { null } | $ { { type : 'new' , line : '5' , newLine : '5' } }
$ { 'with parallel and right side' } | $ { { left : { old _line : 3 } , right : { new _line : 5 } } } | $ { false } | $ { { type : 'old' , line : '3' , oldLine : '3' } } | $ { { type : 'new' , line : '5' , newLine : '5' } }
` (' $ desc, sets interop data attributes', ({ line, inline, leftSide, rightSide }) => {
const wrapper = createWrapper ( { props : { line , inline } } ) ;
expect ( findInteropAttributes ( wrapper , '[data-testid="left-side"]' ) ) . toEqual ( leftSide ) ;
expect ( findInteropAttributes ( wrapper , '[data-testid="right-side"]' ) ) . toEqual ( rightSide ) ;
} ) ;
} ) ;
2021-01-29 00:20:46 +05:30
} ) ;