import test from 'node:test' import assert from 'node:assert/strict' import crypto from 'node:crypto' import sinon from 'sinon' import { Challenge } from '../Challenge.js' import { GitAffected } from '../GitAffected.js' import { Solution } from '../Solution.js' import { parseCommandOutput } from '../../utils/parseCommandOutput.js' const gitAffected = new GitAffected() await test('services/GitAffected', async (t) => { t.afterEach(() => { sinon.restore() }) t.beforeEach(() => { sinon.stub(crypto, 'randomUUID').value(() => { return 'uuid' }) }) await t.test('parseCommandOutput', async (t) => { await t.test('returns the right output array', async () => { assert.deepStrictEqual(parseCommandOutput('1.txt\n 2.txt '), [ '1.txt', '2.txt' ]) }) }) await t.test('getAffectedSolutionsFromFiles', async (t) => { await t.test('returns the affected solutions', async () => { const files = [ 'challenges/hello-world/solutions/javascript/function/solution.js', 'challenges/is-palindrome/solutions/c/function/input.c' ] const solutions = await gitAffected.getAffectedSolutionsFromFiles(files) assert.deepStrictEqual(solutions, [ new Solution({ challenge: new Challenge({ name: 'hello-world' }), name: 'function', programmingLanguageName: 'javascript' }), new Solution({ challenge: new Challenge({ name: 'is-palindrome' }), name: 'function', programmingLanguageName: 'c' }) ]) }) await t.test( 'returns the affected solutions from Dockerfile changes', async () => { const files = ['templates/docker/javascript/Dockerfile'] const solutions = await gitAffected.getAffectedSolutionsFromFiles(files) assert.deepStrictEqual( solutions[0], new Solution({ challenge: new Challenge({ name: 'camel-case' }), name: 'function', programmingLanguageName: 'javascript' }) ) assert.deepStrictEqual( solutions[1], new Solution({ challenge: new Challenge({ name: 'first-non-repeating-character' }), name: 'function', programmingLanguageName: 'javascript' }) ) } ) await t.test( 'returns the affected solutions from Docker template changes', async () => { const files = ['templates/docker/javascript/package.json'] const solutions = await gitAffected.getAffectedSolutionsFromFiles(files) assert.deepStrictEqual( solutions[0], new Solution({ challenge: new Challenge({ name: 'camel-case' }), name: 'function', programmingLanguageName: 'javascript' }) ) assert.deepStrictEqual( solutions[1], new Solution({ challenge: new Challenge({ name: 'first-non-repeating-character' }), name: 'function', programmingLanguageName: 'javascript' }) ) } ) await t.test( 'returns the affected solutions from input/output files', async () => { const files = ['challenges/hello-world/test/1/input.txt'] const solutions = await gitAffected.getAffectedSolutionsFromFiles(files) assert.deepStrictEqual( solutions[0], new Solution({ challenge: new Challenge({ name: 'hello-world' }), name: 'function', programmingLanguageName: 'c' }) ) assert.deepStrictEqual( solutions[1], new Solution({ challenge: new Challenge({ name: 'hello-world' }), name: 'function', programmingLanguageName: 'cpp' }) ) assert.deepStrictEqual( solutions[2], new Solution({ challenge: new Challenge({ name: 'hello-world' }), name: 'function', programmingLanguageName: 'cs' }) ) assert.deepStrictEqual( solutions[3], new Solution({ challenge: new Challenge({ name: 'hello-world' }), name: 'function', programmingLanguageName: 'dart' }) ) } ) }) })