|
# retoor <retoor@molodetz.nl>
|
|
|
|
from pathlib import Path
|
|
|
|
from devplacepy.services.jobs.isslop.analysis.engine import _javascript_alias_prefixes
|
|
from devplacepy.services.jobs.isslop.analysis.signals import FileContext, RepoContext
|
|
from devplacepy.services.jobs.isslop.analysis.signals.hallucination import detect_hallucination
|
|
|
|
|
|
def _context(text: str, aliases: frozenset = frozenset(), deps: frozenset = frozenset({"next", "react", "@clerk/nextjs"})):
|
|
repo = RepoContext(
|
|
root=Path("/tmp"),
|
|
python_dependencies=frozenset(),
|
|
javascript_dependencies=deps,
|
|
local_python_modules=frozenset(),
|
|
has_python_manifest=False,
|
|
has_javascript_manifest=True,
|
|
javascript_alias_prefixes=aliases,
|
|
)
|
|
return FileContext(
|
|
path=Path("/tmp/x.tsx"),
|
|
relative="src/x.tsx",
|
|
language="typescript",
|
|
text=text,
|
|
lines=text.splitlines(),
|
|
comments=[],
|
|
metrics=None,
|
|
repo=repo,
|
|
fingerprint_only=False,
|
|
)
|
|
|
|
|
|
def test_path_aliases_are_never_unresolved():
|
|
text = (
|
|
"import { Sponsors } from '@/components/Sponsors';\n"
|
|
"import config from '~/config';\n"
|
|
"import db from '#app/db';\n"
|
|
"import { page } from '$app/stores';\n"
|
|
)
|
|
assert detect_hallucination(_context(text)) == []
|
|
|
|
|
|
def test_tsconfig_alias_prefixes_are_respected():
|
|
text = "import { helper } from 'src/utils/helper';\n"
|
|
assert len(detect_hallucination(_context(text))) == 1
|
|
assert detect_hallucination(_context(text, aliases=frozenset({"src/"}))) == []
|
|
|
|
|
|
def test_declared_package_subpaths_resolve():
|
|
text = (
|
|
"import Image from 'next/image';\n"
|
|
"import { auth } from '@clerk/nextjs/server';\n"
|
|
"import { useState } from 'react';\n"
|
|
)
|
|
assert detect_hallucination(_context(text)) == []
|
|
|
|
|
|
def test_node_builtins_and_schemes_resolve():
|
|
text = (
|
|
"import fs from 'node:fs';\n"
|
|
"import hooks from 'async_hooks';\n"
|
|
"import content from 'virtual:generated';\n"
|
|
)
|
|
assert detect_hallucination(_context(text)) == []
|
|
|
|
|
|
def test_genuinely_missing_package_is_flagged():
|
|
findings = detect_hallucination(_context("import magic from 'left-pad-ultra';\n"))
|
|
assert len(findings) == 1
|
|
assert findings[0].code == "DEP_UNRESOLVED"
|
|
assert "left-pad-ultra" in findings[0].title
|
|
|
|
|
|
def test_alias_prefix_parser_reads_jsonc(tmp_path):
|
|
(tmp_path / "tsconfig.json").write_text(
|
|
"""{
|
|
// path aliases
|
|
"compilerOptions": {
|
|
"paths": {
|
|
"@/*": ["./src/*"],
|
|
"~lib/*": ["./lib/*"], /* legacy */
|
|
},
|
|
},
|
|
}""",
|
|
encoding="utf-8",
|
|
)
|
|
assert _javascript_alias_prefixes(tmp_path) == frozenset({"@/", "~lib/"})
|