import { describe, it, expect } from 'vitest' import { EjsHelpers } from '../../src/templates/EjsHelpers.js' describe('EjsHelpers', () => { describe('if', () => { it('returns trueValue when condition is met', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.if(true, 'true', 'false') expect(result).toEqual('true') }) it('returns falseValue when condition is not met', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.if(false, 'true', 'false') expect(result).toEqual('false') }) }) describe('ifTs', () => { it('returns trueValue when useTypeScript is true', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: true }) const result = _.ifTs('true', 'false') expect(result).toEqual('true') }) it('returns falseValue when useTypeScript is false', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.ifTs('true', 'false') expect(result).toEqual('false') }) it('returns blank when useTypeScript is false and falseValue is not defined', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.ifTs('true') expect(result).toEqual('') }) }) describe('ifEsm', () => { it('returns trueValue when useEsm is true', () => { const _ = new EjsHelpers({ useEsm: true, useTypeScript: false }) const result = _.ifEsm('true', 'false') expect(result).toEqual('true') }) it('returns falseValue when useEsm is false', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.ifEsm('true', 'false') expect(result).toEqual('false') }) it('returns blank when useEsm is false and falseValue is not defined', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: true }) const result = _.ifEsm('true') expect(result).toEqual('') }) }) describe('param', () => { it('returns parameter name and type when useTypeScript is true', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: true }) const result = _.param('actor', 'Actor') expect(result).toEqual('actor: Actor') }) it('returns parameter name when useTypeScript is false', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.param('actor', 'Actor') expect(result).toEqual('actor') }) }) describe('returns', () => { it('returns return type when useTypeScript is true', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: true }) const result = _.returns('string[]') expect(result).toEqual(': string[]') }) it('returns blank when useTypeScript is false', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) const result = _.returns('string[]') expect(result).toEqual('') }) }) describe('import', () => { const exports = 'By, contains, type Answerable' const moduleId = '@serenity-js/examples' const localDirectory = '../lib/' const localFile = '../lib/local' describe('when useTypeScript is true', () => { it('generates import statement for TypeScript, as-is', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: true }) const statement = _.import(exports, moduleId) expect(statement).toEqual(`import { ${ exports } } from '${ moduleId }'`) }) describe('and useEsm is true', () => { it('adds index.js to the module path if it is relative and has a trailing slash', () => { const _ = new EjsHelpers({ useEsm: true, useTypeScript: true }) const statement = _.import(exports, localDirectory) expect(statement).toEqual(`import { ${ exports } } from '${ localDirectory }index.js'`) }) it('adds .js to the module path if it is relative and has no trailing slash', () => { const _ = new EjsHelpers({ useEsm: true, useTypeScript: true }) const statement = _.import(exports, localFile) expect(statement).toEqual(`import { ${ exports } } from '${ localFile }.js'`) }) }) }) describe('when useEsm is true', () => { const _ = new EjsHelpers({ useEsm: true, useTypeScript: false }) it('generates import statement for ESM, removing any type imports', () => { const statement = _.import(exports, moduleId) expect(statement).toEqual(`import { By, contains } from '${ moduleId }'`) }) it('prints nothing if there are no imports left', () => { const statement = _.import('type Actor', moduleId) expect(statement).toEqual('') }) it('adds index.js to the module path if it is relative and has a trailing slash', () => { const statement = _.import(exports, localDirectory) expect(statement).toEqual(`import { By, contains } from '${ localDirectory }index.js'`) }) it('adds .js to the module path if it is relative and has no trailing slash', () => { const statement = _.import(exports, localFile) expect(statement).toEqual(`import { By, contains } from '${ localFile }.js'`) }) }) describe('when both useEsm and useTypeScript are false', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) it('generates import statement for CommonJS, removing any type imports', () => { const statement = _.import(exports, moduleId) expect(statement).toEqual(`const { By, contains } = require('${ moduleId }')`) }) it('does not add index.js to the module path if it is relative and has a trailing slash', () => { const statement = _.import(exports, localDirectory) expect(statement).toEqual(`const { By, contains } = require('${ localDirectory }')`) }) it('does not add .js to the module path if it is relative and has no trailing slash', () => { const statement = _.import(exports, localFile) expect(statement).toEqual(`const { By, contains } = require('${ localFile }')`) }) }) }) describe('export', () => { describe('when useTypeScript is true', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: true }) it('generates export for a class', () => { const statement = _.export('class', 'MyClass') expect(statement).toEqual('export class MyClass') }) it('generates export for a variable', () => { const statement = _.export('const', 'actor') expect(statement).toEqual('export const actor') }) }) describe('when useTypeScript is false and useEsm is true', () => { const _ = new EjsHelpers({ useEsm: true, useTypeScript: false }) it('generates export for a class', () => { const statement = _.export('class', 'MyClass') expect(statement).toEqual('export class MyClass') }) it('generates export for a variable', () => { const statement = _.export('const', 'actor') expect(statement).toEqual('export const actor') }) }) describe('when useTypeScript is false and useEsm is false', () => { const _ = new EjsHelpers({ useEsm: false, useTypeScript: false }) it('generates export for a class', () => { const statement = _.export('class', 'MyClass') expect(statement).toEqual('module.exports.MyClass = class MyClass') }) it('generates export for a variable', () => { const statement = _.export('const', 'actor') expect(statement).toEqual('module.exports.actor') }) }) }) })