Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 73 additions & 30 deletions packages/ember-cli-code-coverage/lib/attach-middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,17 @@ function logError(err, req, res, next) {
next(err);
}

function getInRepoPaths(root) {
let pkgJSONPath = path.join(root, 'package.json');

if (fs.existsSync(pkgJSONPath)) {
let pkgJSON = fs.readJsonSync(path.join(root, 'package.json'));
return (pkgJSON['ember-addon'] && pkgJSON['ember-addon']['paths']) || [];
}

return [];
}

/*
* This function normalizes the relativePath to match what we get from a classical app. Its goal
* is to change any in repo paths like: app-namespace/lib/in-repo-namespace/components/foo.js to
Expand All @@ -24,29 +35,24 @@ function logError(err, req, res, next) {
function normalizeRelativePath(root, filepath) {
let embroiderTmpPathRegex = /embroider\/.{6}/gm;
let relativePath = filepath.split(embroiderTmpPathRegex)[1].slice(1);

if (fs.existsSync(path.join(root, 'package.json'))) {
let pkgJSON = fs.readJsonSync(path.join(root, 'package.json'));
let inRepoPaths =
(pkgJSON['ember-addon'] && pkgJSON['ember-addon']['paths']) || [];

for (let i = 0; i <= inRepoPaths.length; i++) {
// this regex checks that the relative path is: app-namespace/path/to/inrepo
let inRepoPathRegex = new RegExp('[^/]+/' + inRepoPaths[i], 'gi');
if (inRepoPathRegex.test(relativePath)) {
relativePath = path.join(
inRepoPaths[i].split(path.sep).slice(-1)[0],
filepath.split(inRepoPaths[i])[1]
);
break;
} else if (relativePath.startsWith(inRepoPaths[i])) {
// this checks if relative path is: /path/to/inrepo
relativePath = path.join(
inRepoPaths[i].split(path.sep).slice(-1)[0],
filepath.split(inRepoPaths[i])[1]
);
break;
}
let inRepoPaths = getInRepoPaths(root);

for (let inRepoPath of inRepoPaths) {
// this regex checks that the relative path is: app-namespace/path/to/inrepo
let inRepoPathRegex = new RegExp('[^/]+/' + inRepoPath, 'gi');
if (inRepoPathRegex.test(relativePath)) {
relativePath = path.join(
inRepoPath.split(path.sep).slice(-1)[0],
filepath.split(inRepoPath)[1]
);
break;
} else if (relativePath.startsWith(inRepoPath)) {
// this checks if relative path is: /path/to/inrepo
relativePath = path.join(
inRepoPath.split(path.sep).slice(-1)[0],
filepath.split(inRepoPath)[1]
);
break;
}
}

Expand All @@ -62,7 +68,7 @@ function normalizeRelativePath(root, filepath) {
* where as in Classic it will be the "actual" app like: `/Users/x/y/z/ember-test-app/ember-test-app/components/foo.js`
* both of these absolute paths should be converted into `app/components/foo.js`
*/
function adjustCoverageKey(root, filepath, namespaceMappings) {
function adjustCoverageKey(root, filepath, namespaceMappings, inRepoPaths) {
let relativePath = path.relative(root, filepath);
let embroiderTmpPathRegex = /embroider\/.{6}/gm;

Expand All @@ -82,9 +88,16 @@ function adjustCoverageKey(root, filepath, namespaceMappings) {
}

if (namespaceMappings.has(namespaceKey)) {
return path.join(
...[namespaceMappings.get(namespaceKey), ...pathWithoutNamespace]
);
let namespaceValue = namespaceMappings.get(namespaceKey);
let inRepoPath =
namespaceValue.endsWith('app') &&
inRepoPathForApp(root, relativePath, pathWithoutNamespace, inRepoPaths);

if (inRepoPath) {
return inRepoPath;
}

return path.join(...[namespaceValue, ...pathWithoutNamespace]);
}

// use the default key which will point to project root. this should only
Expand All @@ -95,20 +108,50 @@ function adjustCoverageKey(root, filepath, namespaceMappings) {

function adjustCoverage(coverage, options) {
let { root, namespaceMappings } = options;
let inRepoPaths = getInRepoPaths(root);

const adjustedCoverage = Object.keys(coverage).reduce((memo, filePath) => {
let relativeToProjectRoot = adjustCoverageKey(
root,
filePath,
namespaceMappings
namespaceMappings,
inRepoPaths
);
coverage[filePath].path = path.relative(root, relativeToProjectRoot);
memo[path.relative(root, relativeToProjectRoot)] = coverage[filePath];

let relativePath = path.relative(root, relativeToProjectRoot);

coverage[filePath].path = relativePath;
memo[relativePath] = coverage[filePath];
return memo;
}, {});

return adjustedCoverage;
}

function inRepoPathForApp(
root,
relativePath,
pathWithoutNamespace,
inRepoPaths
) {
if (inRepoPaths.length === 0) return;

if (fs.existsSync(path.join(root, 'app', ...pathWithoutNamespace))) return;

for (let inRepoPath of inRepoPaths) {
let possibleAppPath = path.join(
root,
inRepoPath,
'app',
...pathWithoutNamespace
);

if (fs.existsSync(possibleAppPath)) {
return possibleAppPath;
}
}
}

function writeCoverage(coverage, options, map) {
let { root } = options;
const adjustedCoverage = adjustCoverage(coverage, options);
Expand Down
52 changes: 52 additions & 0 deletions test-packages/__snapshots__/custom-path-in-repo-addon-test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,58 @@ Object {
"total": 1,
},
},
"local-lib/addons/my-in-repo-addon/app/utils/my-covered-util.js": Object {
"branches": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"functions": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"lines": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"statements": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
},
"local-lib/addons/my-in-repo-addon/app/utils/my-uncovered-util.js": Object {
"branches": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"functions": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"lines": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"statements": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
},
"total": Object {
"branches": Object {
"covered": 0,
Expand Down
96 changes: 87 additions & 9 deletions test-packages/__snapshots__/in-repo-addon-test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,84 @@ Object {
"total": 1,
},
},
"lib/my-in-repo-addon/app/utils/my-covered-util.js": Object {
"branches": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"functions": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"lines": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"statements": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
},
"lib/my-in-repo-addon/app/utils/my-in-repo-addon-app-covered-util.js": Object {
"branches": Object {
"covered": 0,
"pct": 100,
"skipped": 0,
"total": 0,
},
"functions": Object {
"covered": 1,
"pct": 100,
"skipped": 0,
"total": 1,
},
"lines": Object {
"covered": 1,
"pct": 100,
"skipped": 0,
"total": 1,
},
"statements": Object {
"covered": 1,
"pct": 100,
"skipped": 0,
"total": 1,
},
},
"lib/my-in-repo-addon/app/utils/my-uncovered-util.js": Object {
"branches": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"functions": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"lines": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
"statements": Object {
"covered": 0,
"pct": 0,
"skipped": 0,
"total": 0,
},
},
"total": Object {
"branches": Object {
"covered": 0,
Expand All @@ -244,22 +322,22 @@ Object {
"total": 2,
},
"functions": Object {
"covered": 3,
"pct": 33.33,
"covered": 4,
"pct": 40,
"skipped": 0,
"total": 9,
"total": 10,
},
"lines": Object {
"covered": 8,
"pct": 47.06,
"covered": 9,
"pct": 50,
"skipped": 0,
"total": 17,
"total": 18,
},
"statements": Object {
"covered": 8,
"pct": 47.06,
"covered": 9,
"pct": 50,
"skipped": 0,
"total": 17,
"total": 18,
},
},
}
Expand Down
18 changes: 10 additions & 8 deletions test-packages/attach-middleware-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,18 @@ describe('attach-middleware', () => {
['hello', 'lib/hello/addon'],
['hello/test-support', 'lib/hello/addon-test-support'],
]);
let inRepoPaths = ['lib/hello'];

expect(adjustCoverageKey(root, path.join(root, 'app-namespace/app.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'app-namespace/app.js'), namespaceMappings, inRepoPaths))
.toEqual('app/app.js');

expect(adjustCoverageKey(root, path.join(root, 'app-namespace/components/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'app-namespace/components/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('app/components/foo.js');

expect(adjustCoverageKey(root, path.join(root, 'hello/components/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'hello/components/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('lib/hello/addon/components/foo.js');

expect(adjustCoverageKey(root, path.join(root, 'hello/test-support/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'hello/test-support/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('lib/hello/addon-test-support/foo.js');
});

Expand All @@ -62,17 +63,18 @@ describe('attach-middleware', () => {
['hello', 'lib/hello/addon'],
['hello/test-support', 'lib/hello/addon-test-support'],
]);
let inRepoPaths = ['lib/hello'];

expect(adjustCoverageKey(root, path.join(root, 'addon-namespace/components/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'addon-namespace/components/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('addon/components/foo.js');

expect(adjustCoverageKey(root, path.join(root, 'addon-namespace/test-support/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'addon-namespace/test-support/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('addon-test-support/foo.js');

expect(adjustCoverageKey(root, path.join(root, 'hello/components/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'hello/components/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('lib/hello/addon/components/foo.js');

expect(adjustCoverageKey(root, path.join(root, 'hello/test-support/foo.js'), namespaceMappings))
expect(adjustCoverageKey(root, path.join(root, 'hello/test-support/foo.js'), namespaceMappings, inRepoPaths))
.toEqual('lib/hello/addon-test-support/foo.js');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function myInRepoAddonAppCoveredUtil() {
return true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import myInRepoAddonAppCoveredUtil from 'my-app-with-in-repo-addon/utils/my-in-repo-addon-app-covered-util';
import { module, test } from 'qunit';

module('Unit | Utility | my in repo addon app covered util');

// Replace this with your real tests.
test('it works', function(assert) {
let result = myInRepoAddonAppCoveredUtil();
assert.ok(result);
});