Skip to content

Commit

Permalink
[Tests] no-restricted-paths: import type tests
Browse files Browse the repository at this point in the history
  • Loading branch information
golergka authored and ljharb committed May 19, 2022
1 parent 9f401a8 commit 180c3b5
Show file tree
Hide file tree
Showing 2 changed files with 270 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -33,6 +33,7 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
- [Performance] `ExportMap`: add caching after parsing for an ambiguous module ([#2531], thanks [@stenin-nikita])
- [Docs] [`no-useless-path-segments`]: fix paths ([#2424], thanks [@s-h-a-d-o-w])
- [Tests] [`no-cycle`]: add passing test cases ([#2438], thanks [@georeith])
- [Tests] [`no-restricted-paths`]: Tests for `import type` statements, thanks [@golergka]

## [2.26.0] - 2022-04-05

Expand Down Expand Up @@ -1588,6 +1589,7 @@ for info on changes for earlier releases.
[@georeith]: https://github.com/georeith
[@gavriguy]: https://github.com/gavriguy
[@giodamelio]: https://github.com/giodamelio
[@golergka]: https://github.com/golergka
[@golopot]: https://github.com/golopot
[@GoodForOneFare]: https://github.com/GoodForOneFare
[@graingert]: https://github.com/graingert
Expand Down
270 changes: 268 additions & 2 deletions tests/src/rules/no-restricted-paths.js
@@ -1,8 +1,7 @@
import { RuleTester } from 'eslint';
import { getTSParsers, test, testFilePath } from '../utils';
import rule from 'rules/no-restricted-paths';

import { test, testFilePath } from '../utils';

const ruleTester = new RuleTester();

ruleTester.run('no-restricted-paths', rule, {
Expand Down Expand Up @@ -712,3 +711,270 @@ ruleTester.run('no-restricted-paths', rule, {
}),
),
});

context('Typescript', function () {
getTSParsers().forEach(parser => {
const settings = {
'import/parsers': { [parser]: ['.ts'] },
'import/resolver': { 'eslint-import-resolver-typescript': true },
};
ruleTester.run('no-restricted-paths', rule, {
valid: [
test({
code: 'import type a from "../client/a.ts"',
filename: testFilePath('./restricted-paths/server/b.ts'),
options: [ {
zones: [ { target: './tests/files/restricted-paths/server', from: './tests/files/restricted-paths/other' } ],
} ],
parser,
settings,
}),
test({
code: 'import type a from "../client/a.ts"',
filename: testFilePath('./restricted-paths/server/b.ts'),
options: [ {
zones: [ { target: '**/*', from: './tests/files/restricted-paths/other' } ],
} ],
parser,
settings,
}),
test({
code: 'import type a from "../client/a.ts"',
filename: testFilePath('./restricted-paths/client/b.ts'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/!(client)/**/*',
from: './tests/files/restricted-paths/client/**/*',
} ],
} ],
parser,
settings,
}),
test({
code: 'import type b from "../server/b.ts"',
filename: testFilePath('./restricted-paths/client/a.ts'),
options: [ {
zones: [ { target: './tests/files/restricted-paths/client', from: './tests/files/restricted-paths/other' } ],
} ],
parser,
settings,
}),
test({
code: 'import type a from "./a.ts"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/server/one',
from: './tests/files/restricted-paths/server',
except: ['./one'],
} ],
} ],
parser,
settings,
}),
test({
code: 'import type a from "../two/a.ts"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/server/one',
from: './tests/files/restricted-paths/server',
except: ['./two'],
} ],
} ],
parser,
settings,
}),
test({
code: 'import type a from "../one/a.ts"',
filename: testFilePath('./restricted-paths/server/two-new/a.ts'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/server/two',
from: './tests/files/restricted-paths/server',
except: [],
} ],
} ],
parser,
settings,
}),
test({
code: 'import type A from "../two/a.ts"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: '**/*',
from: './tests/files/restricted-paths/server/**/*',
except: ['**/a.js'],
} ],
} ],
parser,
settings,
}),
// no config
test({ code: 'import type b from "../server/b.js"', parser, settings }),
test({ code: 'import type * as b from "../server/b.js"', parser, settings }),
],
invalid: [
test({
code: 'import type b from "../server/b"',
filename: testFilePath('./restricted-paths/client/a.ts'),
options: [ {
zones: [ { target: './tests/files/restricted-paths/client', from: './tests/files/restricted-paths/server' } ],
} ],
errors: [ {
message: 'Unexpected path "../server/b" imported in restricted zone.',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type b from "../server/b"',
filename: testFilePath('./restricted-paths/client/a.ts'),
options: [ {
zones: [ { target: './tests/files/restricted-paths/client/**/*', from: './tests/files/restricted-paths/server' } ],
} ],
errors: [ {
message: 'Unexpected path "../server/b" imported in restricted zone.',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type a from "../client/a"\nimport type c from "./c.ts"',
filename: testFilePath('./restricted-paths/server/b.ts'),
options: [ {
zones: [
{ target: './tests/files/restricted-paths/server', from: './tests/files/restricted-paths/client' },
{ target: './tests/files/restricted-paths/server', from: './tests/files/restricted-paths/server/c.ts' },
],
} ],
errors: [
{
message: 'Unexpected path "../client/a" imported in restricted zone.',
line: 1,
column: 20,
},
{
message: 'Unexpected path "./c" imported in restricted zone.',
line: 2,
column: 20,
},
],
parser,
settings,
}),
test({
code: 'import type b from "../server/b"',
filename: testFilePath('./restricted-paths/client/a'),
options: [ {
zones: [ { target: './client', from: './server' } ],
basePath: testFilePath('./restricted-paths'),
} ],
errors: [ {
message: 'Unexpected path "../server/b" imported in restricted zone.',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type b from "../two/a"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/server/one',
from: './tests/files/restricted-paths/server',
except: ['./one'],
} ],
} ],
errors: [ {
message: 'Unexpected path "../two/a" imported in restricted zone.',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type b from "../two/a"',
filename: testFilePath('./restricted-paths/server/one/a'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/server/one',
from: './tests/files/restricted-paths/server',
except: ['./one'],
message: 'Custom message',
} ],
} ],
errors: [ {
message: 'Unexpected path "../two/a" imported in restricted zone. Custom message',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type b from "../two/a"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: './tests/files/restricted-paths/server/one',
from: './tests/files/restricted-paths/server',
except: ['../client/a'],
} ],
} ],
errors: [ {
message: 'Restricted path exceptions must be descendants of the configured ' +
'`from` path for that zone.',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type A from "../two/a"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: '**/*',
from: './tests/files/restricted-paths/server/**/*',
} ],
} ],
errors: [ {
message: 'Unexpected path "../two/a" imported in restricted zone.',
line: 1,
column: 20,
} ],
parser,
settings,
}),
test({
code: 'import type A from "../two/a"',
filename: testFilePath('./restricted-paths/server/one/a.ts'),
options: [ {
zones: [ {
target: '**/*',
from: './tests/files/restricted-paths/server/**/*',
except: ['a.ts'],
} ],
} ],
errors: [ {
message: 'Restricted path exceptions must be glob patterns when `from` contains glob patterns',
line: 1,
column: 20,
} ],
parser,
settings,
}),
],
});
});
});

0 comments on commit 180c3b5

Please sign in to comment.