import 'mocha' ; import { expect } from 'chai' ; import { CollectionData } from 'js-yaml-loader!@/*' ; import { parseProjectInformation } from '@/application/Parser/ProjectInformationParser' ; import { CategoryCollectionParserType , parseApplication } from '@/application/Parser/ApplicationParser' ; import WindowsData from 'js-yaml-loader!@/application/collections/windows.yaml' ; import MacOsData from 'js-yaml-loader!@/application/collections/macos.yaml' ; import { IProjectInformation } from '@/domain/IProjectInformation' ; import { ProjectInformation } from '@/domain/ProjectInformation' ; import { ICategoryCollection } from '@/domain/ICategoryCollection' ; import { OperatingSystem } from '@/domain/OperatingSystem' ; import { getEnumValues } from '@/application/Common/Enum' ; import { CategoryCollectionStub } from '@tests/unit/stubs/CategoryCollectionStub' ; import { getProcessEnvironmentStub } from '@tests/unit/stubs/ProcessEnvironmentStub' ; import { CollectionDataStub } from '@tests/unit/stubs/CollectionDataStub' ; describe ( 'ApplicationParser' , ( ) => { describe ( 'parseApplication' , ( ) => { describe ( 'parser' , ( ) => { it ( 'returns result from the parser' , ( ) => { const os = OperatingSystem . macOS ; const data = new CollectionDataStub ( ) ; const expected = new CategoryCollectionStub ( ) . withOs ( os ) ; const parser = new CategoryCollectionParserSpy ( ) . setUpReturnValue ( data , expected ) . mockParser ( ) ; const env = getProcessEnvironmentStub ( ) ; const collections = [ data ] ; const app = parseApplication ( parser , env , collections ) ; const actual = app . getCollection ( os ) ; expect ( expected ) . to . equal ( actual ) ; } ) ; } ) ; describe ( 'processEnv' , ( ) => { it ( 'used to parse expected project information' , ( ) => { const env = getProcessEnvironmentStub ( ) ; const expected = parseProjectInformation ( env ) ; const parserSpy = new CategoryCollectionParserSpy ( ) ; const parserMock = parserSpy . mockParser ( ) ; const app = parseApplication ( parserMock , env ) ; expect ( expected ) . to . deep . equal ( app . info ) ; expect ( parserSpy . arguments . map ( ( arg ) => arg . info ) . every ( ( info ) => info === expected ) ) ; } ) ; it ( 'defaults to process.env' , ( ) => { const { env } = process ; const expected = parseProjectInformation ( env ) ; const parserSpy = new CategoryCollectionParserSpy ( ) ; const parserMock = parserSpy . mockParser ( ) ; const app = parseApplication ( parserMock ) ; expect ( expected ) . to . deep . equal ( app . info ) ; expect ( parserSpy . arguments . map ( ( arg ) => arg . info ) . every ( ( info ) => info === expected ) ) ; } ) ; } ) ; describe ( 'collectionsData' , ( ) => { describe ( 'set as expected' , ( ) => { const testCases = [ { name : 'single collection' , input : [ new CollectionDataStub ( ) ] , output : [ new CategoryCollectionStub ( ) . withOs ( OperatingSystem . macOS ) ] , } , { name : 'multiple collections' , input : [ new CollectionDataStub ( ) . withOs ( 'windows' ) , new CollectionDataStub ( ) . withOs ( 'macos' ) , ] , output : [ new CategoryCollectionStub ( ) . withOs ( OperatingSystem . macOS ) , new CategoryCollectionStub ( ) . withOs ( OperatingSystem . Windows ) , ] , } , ] ; for ( const testCase of testCases ) { it ( testCase . name , ( ) => { const env = getProcessEnvironmentStub ( ) ; let parserSpy = new CategoryCollectionParserSpy ( ) ; for ( let i = 0 ; i < testCase . input . length ; i ++ ) { parserSpy = parserSpy . setUpReturnValue ( testCase . input [ i ] , testCase . output [ i ] ) ; } const parserMock = parserSpy . mockParser ( ) ; const app = parseApplication ( parserMock , env , testCase . input ) ; expect ( app . collections ) . to . deep . equal ( testCase . output ) ; } ) ; } } ) ; it ( 'defaults to expected data' , ( ) => { const expected = [ WindowsData , MacOsData ] ; const parserSpy = new CategoryCollectionParserSpy ( ) ; const parserMock = parserSpy . mockParser ( ) ; parseApplication ( parserMock ) ; const actual = parserSpy . arguments . map ( ( args ) => args . data ) ; expect ( actual ) . to . deep . equal ( expected ) ; } ) ; describe ( 'throws when data is invalid' , ( ) => { const testCases = [ { expectedError : 'no collection provided' , data : [ ] , } , { expectedError : 'undefined collection provided' , data : [ new CollectionDataStub ( ) , undefined ] , } , ] ; for ( const testCase of testCases ) { it ( testCase . expectedError , ( ) => { const parserMock = new CategoryCollectionParserSpy ( ) . mockParser ( ) ; const env = getProcessEnvironmentStub ( ) ; const act = ( ) => parseApplication ( parserMock , env , testCase . data ) ; expect ( act ) . to . throw ( testCase . expectedError ) ; } ) ; } } ) ; } ) ; } ) ; } ) ; class CategoryCollectionParserSpy { public arguments = new Array < { data : CollectionData ; info : ProjectInformation ; } > ( ) ; private returnValues = new Map < CollectionData , ICategoryCollection > ( ) ; public setUpReturnValue ( data , collection ) { this . returnValues . set ( data , collection ) ; return this ; } public mockParser ( ) { return ( data , info ) => { this . arguments . push ( { data , info } ) ; if ( this . returnValues . has ( data ) ) { return this . returnValues . get ( data ) ; } const currentRun = this . arguments . length - 1 ; const nextOs = getEnumValues ( OperatingSystem ) [ currentRun ] ; return new CategoryCollectionStub ( ) . withOs ( nextOs ) ; } ; } }