Skip to content

Commit

Permalink
Mock file path resolving in tests + reintroduce subgraph test
Browse files Browse the repository at this point in the history
  • Loading branch information
guyca committed Jun 15, 2024
1 parent c529289 commit 72cffef
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import path = require('path') ;

export class PathResolver {
public resolve(context: RuleContext<any, any>, relativeFilePath: string) {
return path.join(path.dirname(context.getFilename()), `${relativeFilePath}.ts`);
}
}
4 changes: 2 additions & 2 deletions packages/eslint-plugin-obsidian/rules/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const { unresolvedProviderDependencies } = require('./unresolvedProviderDependencies');
const { unresolvedProviderDependenciesGenerator } = require('./unresolvedProviderDependencies');

module.exports = {
rules: {
'unresolved-provider-dependencies': unresolvedProviderDependencies,
'unresolved-provider-dependencies': unresolvedProviderDependenciesGenerator(),
},
};
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { TSESTree } from '@typescript-eslint/types';
import * as fs from 'fs';
import { parse } from '@typescript-eslint/parser';
import path = require('path') ;
import type { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import * as fs from 'fs';
import { PathResolver } from '../framework/pathResolver';

export type MessageIds = 'unresolved-provider-dependencies';

Expand Down Expand Up @@ -30,6 +30,7 @@ export function getDependenciesFromSubgraphs(
imports: TSESTree.ImportDeclaration[],
subGraphs:string[],
context:RuleContext<'unresolved-provider-dependencies', []>,
pathResolver: PathResolver,
) {
const paths:Record<string, string>[] = [];
const dependencies: string[] = [];
Expand All @@ -42,8 +43,8 @@ export function getDependenciesFromSubgraphs(
});
paths.forEach((el) => {
// eslint-disable-next-line dot-notation
const filePath = path.join(path.dirname(context.getFilename()), `${el['path']}.ts`);
const fileContent = fs.readFileSync(filePath, 'utf8');
const filePath = pathResolver.resolve(context, el['path']);
const fileContent = fs.readFileSync(filePath, { encoding: 'utf8'});
const fileAST = parse(
fileContent,
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ import {
getDecoratorName,
getPropertyDeclarations,
} from './ASTFunctions';
import type { PathResolver } from '../framework/pathResolver';

export function create(context: RuleContext<'unresolved-provider-dependencies', []>) {
export function create(
context: RuleContext<'unresolved-provider-dependencies', []>,
pathResolver: PathResolver,
) {
const imports:TSESTree.ImportDeclaration[] = [];
const dependencies:string[] = [];

Expand All @@ -24,7 +28,7 @@ export function create(context: RuleContext<'unresolved-provider-dependencies',
if (decoratorNames.includes('Graph')) {
const subGraphs = getSubGraphs(decorators);
if (subGraphs.length > 0) {
dependencies.push(...getDependenciesFromSubgraphs(imports, subGraphs, context));
dependencies.push(...getDependenciesFromSubgraphs(imports, subGraphs, context, pathResolver));
}
dependencies.push(...mapFunctions(node));
dependencies.push(...getPropertyDeclarations(node));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
import { ESLintUtils, type TSESLint } from '@typescript-eslint/utils';
import { create } from './createFunction';
import type { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import { create } from './createRule';
import { PathResolver } from '../framework/pathResolver';

type Rule = TSESLint.RuleModule<'unresolved-provider-dependencies', []>;

const createRule = ESLintUtils.RuleCreator(
(name) => `https://wix-incubator.github.io/obsidian/docs/documentation/meta/eslint#${name}`,
);

type Rule = TSESLint.RuleModule<'unresolved-provider-dependencies', []>;


export const unresolvedProviderDependencies: Rule = createRule({
create,
name: 'unresolved-provider-dependencies',
meta: {
docs: {
description: 'Dependencies must be defined in the graph or its subgraphs.',
recommended: 'strict',
export const unresolvedProviderDependenciesGenerator = (
pathResolver: PathResolver = new PathResolver(),
) => {
return createRule({
create: (context: RuleContext<'unresolved-provider-dependencies', []>) => {
return create(context, pathResolver);
},
messages: {
'unresolved-provider-dependencies': 'Dependency {{ dependencyName }} is unresolved.',
name: 'unresolved-provider-dependencies',
meta: {
docs: {
description: 'Dependencies must be defined in the graph or its subgraphs.',
recommended: 'strict',
},
messages: {
'unresolved-provider-dependencies': 'Dependency {{ dependencyName }} is unresolved.',
},
schema: [],
type: 'problem',
},
schema: [],
type: 'problem',
},
defaultOptions: [],
});
defaultOptions: [],
}) satisfies Rule;
};
14 changes: 14 additions & 0 deletions packages/eslint-plugin-obsidian/tests/stubs/PathResolverStub.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import path = require('path') ;
import { PathResolver } from '../../rules/framework/pathResolver';

export class PathResolverStub implements PathResolver {
public resolve(context: RuleContext<any, any>, relativeFilePath: string): string {
switch(relativeFilePath) {
case './subgraph':
return `${context.cwd}/tests/unresolvedProviderDependencies/testUtils/subgraph.ts`;
default:
return path.join(path.dirname(context.getFilename()), `${relativeFilePath}.ts`);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
import { RuleTester } from '@typescript-eslint/rule-tester';
import { validGraphSimple } from './testUtils/validGraphs';
import { unresolvedProviderDependencies } from '../../rules/unresolvedProviderDependencies';
import { validGraphSimple, validGraphWithSubgraph } from './testUtils/validGraphs';
import { unresolvedProviderDependenciesGenerator } from '../../rules/unresolvedProviderDependencies';
import { invalidGraph } from '../../rules/unresolvedProviderDependencies/invalidGraphs';
import { PathResolverStub } from '../stubs/PathResolverStub';

const ruleTester = new RuleTester();

ruleTester.run('unresolved-provider-dependencies', unresolvedProviderDependencies, {
valid: [validGraphSimple],
invalid: [
{
code: invalidGraph,
errors: [{
messageId: 'unresolved-provider-dependencies',
}],
},
],
});
ruleTester.run(
'unresolved-provider-dependencies',
unresolvedProviderDependenciesGenerator(new PathResolverStub()),
{
valid: [validGraphSimple, validGraphWithSubgraph],
invalid: [
{
code: invalidGraph,
errors: [{
messageId: 'unresolved-provider-dependencies',
}],
},
],
}
);

0 comments on commit 72cffef

Please sign in to comment.