UNPKG

archunit

Version:

ArchUnit TypeScript is an architecture testing library, to specify and assert architecture rules in your TypeScript app

151 lines 9.08 kB
"use strict"; 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