import { describe, it } from 'mocha'; import { expect } from 'chai'; import { rollup } from 'rollup'; import nodeResolve from '@rollup/plugin-node-resolve'; import YAML from 'yamljs'; import { manifestMerger } from '../../src/index'; import setupFixture from '../helpers/setup-fixture'; import { PackageJSON } from '../../src/types/packages'; const studioFrameworkPkg: PackageJSON = require('@movable/studio-framework/package.json'); const expectedAppManifest = { name: 'App Manifest', options: [{ name: 'Option 2' }, { framework_version: '1.10.0' }], string_array: ['one', 'two', 'three'], package_manifests: [ { name: '@movable-internal/test-dep', authors: ['Test Developer'] } ], studio_options: { framework_version: studioFrameworkPkg.version, package_dependencies: [ { name: '@movable/studio-framework', version: studioFrameworkPkg.version } ] } }; const bundledManifest = async ({ outputJSON = true, ignoreFrameworkVersionUpdate = false } = {}) => { const outputFile = outputJSON ? 'manifest.json' : 'manifest.yml'; const bundle = await rollup({ input: 'index.js', plugins: [ manifestMerger({ outputJSON, output: outputFile, ignoreFrameworkVersionUpdate }), nodeResolve() ] }); const { output } = await bundle.generate({ format: 'es' }); const file = output.find(({ fileName }) => fileName === outputFile); // @ts-ignore return outputJSON ? JSON.parse(file.source) : YAML.parse(file.source); }; describe('manifestMerger - app test', async () => { setupFixture('test-app-no-integration-ids'); it('can build the manifest via dependencies with yml output', async () => { const manifest = await bundledManifest({ outputJSON: false }); expect(manifest).to.deep.equal(expectedAppManifest); }); it('can optionally ignore the actual Studio Framework version', async () => { const manifest = await bundledManifest({ outputJSON: false, ignoreFrameworkVersionUpdate: true }); expect(manifest).to.deep.equal({ ...expectedAppManifest, studio_options: { framework_version: '2.15' } }); it('can build the manifest via dependencies with json output', async () => { const manifest = await bundledManifest(); expect(manifest).to.deep.equal(expectedAppManifest); }); }); it('can build the manifest via dependencies', async () => { const manifest = await bundledManifest(); expect(manifest).to.deep.equal(expectedAppManifest); }); }); describe('manifestMerger - placeholder strings', () => { setupFixture('test-app-custom-yaml'); it('should add quotes around string values', async () => { const bundle = await rollup({ input: 'index.js', plugins: [ manifestMerger({ outputJSON: false, output: 'manifest.yml' }), nodeResolve() ] }); const { output } = await bundle.generate({ format: 'es' }); const file = output.find(({ fileName }) => fileName === 'manifest.yml'); // @ts-ignore const yamlOutput = file.source as string; expect(yamlOutput).to.include("placeholder: '60218907,60218908,60218909'"); expect(yamlOutput).to.include("placeholder: '12345678, 60218908, 60218909'"); expect(yamlOutput).to.include('placeholder: 3.1415926535'); expect(yamlOutput).to.include("placeholder: '60,218,907'"); expect(yamlOutput).to.include('placeholder: 987654321'); expect(yamlOutput).to.include('placeholder: true'); }); }); describe('manifest merger - integration ids', () => { describe('app with existing ids / dependencies with ids', () => { setupFixture('test-app-with-app-and-package-integration-ids'); it('it can build multiple integration ids from multiple packages', async () => { const manifest = await bundledManifest(); expect(manifest.integration_ids).to.have.members(['app-123', '123', 'abc', 'foo', 'bar']); }); it('it does not duplicate appManifest.integration_ids upon regeneration', async () => { await bundledManifest(); const manifest = await bundledManifest(); expect(manifest.integration_ids).to.have.members(['app-123', '123', 'abc', 'foo', 'bar']); }); }); describe('app with existing ids / dependencies with no ids', () => { setupFixture('test-app-with-app-integration-ids'); it('it can build integration ids with no package integration ids', async () => { const manifest = await bundledManifest(); expect(manifest.integration_ids).to.have.members(['app-123']); }); }); });