archunit
Version:
ArchUnit TypeScript is an architecture testing library, to specify and assert architecture rules in your TypeScript app
151 lines • 9.08 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const typescript_1 = __importDefault(require("typescript"));
const import_kinds_helper_1 = require("./import-kinds-helper");
const import_kinds_1 = require("./import-kinds");
describe('determineImportKinds', () => {
// Helper function to create AST from source code
const createImportDeclaration = (importStatement) => {
const sourceFile = typescript_1.default.createSourceFile('test.ts', importStatement, typescript_1.default.ScriptTarget.Latest, true);
const importDeclaration = sourceFile.statements[0];
if (!typescript_1.default.isImportDeclaration(importDeclaration)) {
throw new Error('Failed to create import declaration');
}
return importDeclaration;
};
describe('side-effect imports', () => {
it('should return empty array for side-effect only import', () => {
const importDecl = createImportDeclaration("import './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual([]);
});
});
describe('default imports', () => {
it('should return VALUE and DEFAULT for default import', () => {
const importDecl = createImportDeclaration("import defaultExport from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.DEFAULT]));
expect(result).toHaveLength(2);
});
it('should return TYPE and DEFAULT for type-only default import', () => {
const importDecl = createImportDeclaration("import type defaultExport from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.TYPE, import_kinds_1.ImportKind.DEFAULT]));
expect(result).toHaveLength(2);
});
});
describe('named imports', () => {
it('should return VALUE and NAMED for named imports', () => {
const importDecl = createImportDeclaration("import { namedExport } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.NAMED]));
expect(result).toHaveLength(2);
});
it('should return TYPE and NAMED for type-only named imports', () => {
const importDecl = createImportDeclaration("import type { TypeExport } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.TYPE, import_kinds_1.ImportKind.NAMED]));
expect(result).toHaveLength(2);
});
it('should handle multiple named imports', () => {
const importDecl = createImportDeclaration("import { export1, export2, export3 } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.NAMED]));
expect(result).toHaveLength(2);
});
});
describe('namespace imports', () => {
it('should return VALUE and NAMESPACE for namespace import', () => {
const importDecl = createImportDeclaration("import * as namespace from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.NAMESPACE]));
expect(result).toHaveLength(2);
});
it('should return TYPE and NAMESPACE for type-only namespace import', () => {
const importDecl = createImportDeclaration("import type * as TypeNamespace from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.TYPE, import_kinds_1.ImportKind.NAMESPACE]));
expect(result).toHaveLength(2);
});
});
describe('mixed imports', () => {
it('should return VALUE, DEFAULT, and NAMED for default + named imports', () => {
const importDecl = createImportDeclaration("import defaultExport, { namedExport } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([
import_kinds_1.ImportKind.VALUE,
import_kinds_1.ImportKind.DEFAULT,
import_kinds_1.ImportKind.NAMED,
]));
expect(result).toHaveLength(3);
});
it('should return TYPE, DEFAULT, and NAMED for type-only default + named imports', () => {
const importDecl = createImportDeclaration("import type defaultExport, { TypeExport } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([
import_kinds_1.ImportKind.TYPE,
import_kinds_1.ImportKind.DEFAULT,
import_kinds_1.ImportKind.NAMED,
]));
expect(result).toHaveLength(3);
});
it('should handle default + multiple named imports', () => {
const importDecl = createImportDeclaration("import defaultExport, { export1, export2 } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([
import_kinds_1.ImportKind.VALUE,
import_kinds_1.ImportKind.DEFAULT,
import_kinds_1.ImportKind.NAMED,
]));
expect(result).toHaveLength(3);
});
});
describe('edge cases', () => {
it('should handle imports with aliases', () => {
const importDecl = createImportDeclaration("import { originalName as alias } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.NAMED]));
expect(result).toHaveLength(2);
});
it('should handle mixed named imports with aliases', () => {
const importDecl = createImportDeclaration("import { export1, export2 as alias } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.NAMED]));
expect(result).toHaveLength(2);
});
it('should handle default import with alias', () => {
const importDecl = createImportDeclaration("import { default as customName } from './module';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toEqual(expect.arrayContaining([import_kinds_1.ImportKind.VALUE, import_kinds_1.ImportKind.NAMED]));
expect(result).toHaveLength(2);
});
});
describe('type vs value distinction', () => {
it('should correctly identify value imports', () => {
const importDecl = createImportDeclaration("import { Component } from 'react';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toContain(import_kinds_1.ImportKind.VALUE);
expect(result).not.toContain(import_kinds_1.ImportKind.TYPE);
});
it('should correctly identify type imports', () => {
const importDecl = createImportDeclaration("import type { ComponentProps } from 'react';");
const result = (0, import_kinds_helper_1.determineImportKinds)(importDecl);
expect(result).toContain(import_kinds_1.ImportKind.TYPE);
expect(result).not.toContain(import_kinds_1.ImportKind.VALUE);
});
});
describe('import clause validation', () => {
it('should handle malformed import gracefully', () => {
// Create a mock import declaration without import clause
const mockImportDecl = {
importClause: null,
};
const result = (0, import_kinds_helper_1.determineImportKinds)(mockImportDecl);
expect(result).toEqual([]);
});
});
});
//# sourceMappingURL=import-kinds-helper.spec.js.map
;