import { expect, test } from "vitest"; import { testDirPath } from "../../../test/helpers/test-dir-path"; import { parseBundle } from "."; test("should error when package.json does not exist", () => { expect(parseBundle.bind(parseBundle, testDirPath(""))).toThrowError( /^Bundle at path \.\/workspaces(\/|\\)nodecg(\/|\\)test does not contain a package\.json!$/, ); }); test('should error when package.json has no "nodecg" property', () => { expect( parseBundle.bind( parseBundle, testDirPath("fixtures/bundle-parser/no-nodecg-prop"), ), ).toThrowErrorMatchingInlineSnapshot( `[Error: no-nodecg-prop's package.json lacks a "nodecg" property, and therefore cannot be parsed.]`, ); }); test("should error when package.json is not valid JSON", () => { expect( parseBundle.bind( parseBundle, testDirPath("fixtures/bundle-parser/invalid-manifest-json"), ), ).toThrowError( /package\.json is not valid JSON, please check it against a validator such as jsonlint\.com/, ); }); test('should return the expected data when "nodecg" property does exist', () => { const parsedBundle = parseBundle( testDirPath("fixtures/bundle-parser/good-bundle"), ); expect(parsedBundle.name).toBe("good-bundle"); expect(parsedBundle.version).toBe("0.0.1"); expect(parsedBundle.description).toBe("A test bundle"); expect(parsedBundle.homepage).toBe("http://github.com/nodecg"); expect(parsedBundle.author).toBe("Alex Van Camp "); expect(parsedBundle.contributors).toEqual(["Matt McNamara"]); expect(parsedBundle.license).toBe("MIT"); expect(parsedBundle.compatibleRange).toBe("~0.7.0"); expect(parsedBundle.bundleDependencies).toBe(undefined); expect(parsedBundle.dir).toBeTypeOf("string"); expect(parsedBundle.dashboard.dir).toBeTypeOf("string"); expect(parsedBundle.dashboard.panels).toEqual([ { name: "test", title: "Test Panel", width: 1, headerColor: "#525F78", path: testDirPath( "fixtures/bundle-parser/good-bundle/dashboard/panel.html", true, ), file: "panel.html", html: "\n\n\t

This is a test panel!

\n\t\n", dialog: false, bundleName: "good-bundle", workspace: "default", fullbleed: false, }, { name: "test-workspace-panel", title: "Test Workspace Panel", width: 1, headerColor: "#ffffff", path: testDirPath( "fixtures/bundle-parser/good-bundle/dashboard/workspace-panel.html", true, ), file: "workspace-panel.html", html: "\n\n\t

This is a test panel that goes into a test " + "workspace!

\n", dialog: false, bundleName: "good-bundle", workspace: "foo", fullbleed: false, }, { name: "test-fullbleed-panel", title: "Test Fullbleed Panel", headerColor: "#525F78", path: testDirPath( "fixtures/bundle-parser/good-bundle/dashboard/fullbleed-panel.html", true, ), file: "fullbleed-panel.html", html: "\n\n\t

This is a test fullbleed panel!

\n", dialog: false, bundleName: "good-bundle", fullbleed: true, workspace: "default", }, { name: "test-dialog", title: "Test Dialog", width: 3, headerColor: "#333222", path: testDirPath( "fixtures/bundle-parser/good-bundle/dashboard/dialog.html", true, ), file: "dialog.html", html: "\n\n\t

This is a test dialog!

\n", dialog: true, dialogButtons: undefined, bundleName: "good-bundle", fullbleed: false, }, ]); expect(Array.isArray(parsedBundle.graphics)).toBe(true); expect(parsedBundle.hasExtension).toBe(true); expect(parsedBundle.soundCues).toMatchInlineSnapshot(` [ { "assignable": true, "name": "name-only", }, { "assignable": true, "defaultVolume": 80, "name": "default-volume", }, { "assignable": false, "name": "non-assignable", }, { "assignable": true, "defaultFile": "../default-file.ogg", "name": "default-file", }, ] `); }); test('should error when "nodecg.compatibleRange" is not a valid semver range', () => { expect( parseBundle.bind( parseBundle, testDirPath("fixtures/bundle-parser/no-compatible-range"), ), ).toThrowErrorMatchingInlineSnapshot( `[Error: no-compatible-range's package.json does not have a valid "nodecg.compatibleRange" property.]`, ); }); test('should error when both "extension.js" and a directory named "extension" exist', () => { expect( parseBundle.bind( parseBundle, testDirPath("fixtures/bundle-parser/double-extension"), ), ).toThrowErrorMatchingInlineSnapshot( `[Error: double-extension has both "extension.js" and a folder named "extension". There can only be one of these, not both.]`, ); }); test('should error when "extension" exists and it is not a directory', () => { expect( parseBundle.bind( parseBundle, testDirPath("fixtures/bundle-parser/illegal-extension"), ), ).toThrowErrorMatchingInlineSnapshot( `[Error: illegal-extension has an illegal file named "extension" in its root. Either rename it to "extension.js", or make a directory named "extension"]`, ); });