Skip to content

Commit

Permalink
test: add @bazel/runfiles test
Browse files Browse the repository at this point in the history
  • Loading branch information
jbedard committed Sep 18, 2024
1 parent bf93e47 commit 0bf6a07
Show file tree
Hide file tree
Showing 19 changed files with 319 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# @generated
# Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "@//:pnpm-lock.yaml").
# Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "@@//:pnpm-lock.yaml").
# This file should be checked into version control along with the pnpm-lock.yaml file.
.npmrc=-2065072158
examples/js_binary/package.json=-41174383
Expand All @@ -15,6 +15,7 @@ examples/npm_package/packages/pkg_a/package.json=1006424040
examples/npm_package/packages/pkg_b/package.json=1041247977
examples/npm_package/packages/pkg_d/package.json=1110895851
examples/npm_package/packages/pkg_e/package.json=-2145239245
examples/runfiles/package.json=-1545884645
examples/webpack_cli/package.json=1911342006
js/private/coverage/bundle/package.json=-1543718929
js/private/image/package.json=-1260474848
Expand All @@ -28,5 +29,5 @@ npm/private/test/vendored/is-odd/package.json=1041695223
npm/private/test/vendored/lodash-4.17.21.tgz=-1206623349
npm/private/test/vendored/semver-max/package.json=578664053
package.json=-275319675
pnpm-lock.yaml=1584807079
pnpm-lock.yaml=814447031
pnpm-workspace.yaml=-762451270
1 change: 1 addition & 0 deletions .bazelignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ examples/npm_package/packages/pkg_b/node_modules/
examples/npm_package/packages/pkg_c/node_modules/
examples/npm_package/packages/pkg_d/node_modules/
examples/npm_package/packages/pkg_e/node_modules/
examples/runfiles/node_modules
examples/webpack_cli/node_modules/
js/private/coverage/bundle/node_modules
js/private/image/node_modules
Expand Down
1 change: 1 addition & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ npm.npm_translate_lock(
"//examples/npm_package/packages/pkg_b:package.json",
"//examples/npm_package/packages/pkg_d:package.json",
"//examples/npm_package/packages/pkg_e:package.json",
"//examples/runfiles:package.json",
"//examples/webpack_cli:package.json",
"//js/private/coverage/bundle:package.json",
"//js/private/image:package.json",
Expand Down
1 change: 1 addition & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ npm_translate_lock(
"//examples/npm_package/packages/pkg_b:package.json",
"//examples/npm_package/packages/pkg_d:package.json",
"//examples/npm_package/packages/pkg_e:package.json",
"//examples/runfiles:package.json",
"//examples/webpack_cli:package.json",
"//js/private/coverage/bundle:package.json",
"//js/private/image:package.json",
Expand Down
1 change: 1 addition & 0 deletions e2e/runfiles/.bazelignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
4 changes: 4 additions & 0 deletions e2e/runfiles/.npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Disabling pnpm [hoisting](https://pnpm.io/npmrc#hoist) by setting `hoist=false` is recommended on
# projects using rules_js so that pnpm outside of Bazel lays out a node_modules tree similar to what
# rules_js lays out under Bazel (without a hidden node_modules/.pnpm/node_modules)
hoist=false
23 changes: 23 additions & 0 deletions e2e/runfiles/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
load("@aspect_rules_js//js:defs.bzl", "js_test")
load("@npm//:defs.bzl", "npm_link_all_packages")

npm_link_all_packages()

js_test(
name = "runfiles",
data = [
"test_fixture.md",
"test_fixture.md.generated_file_suffix",
":node_modules/@bazel/runfiles",
],
entry_point = "test.js",
)

# Path of file must start similar to `test_fixture.md` in order to regression-test a
# scenario where the runfile resolution would accidentally resolve the path to
# `test_fixture.md` through a runfile manifest entry that starts similarly.
genrule(
name = "gen-data",
outs = ["test_fixture.md.generated_file_suffix"],
cmd = """echo "Generated" > $@""",
)
22 changes: 22 additions & 0 deletions e2e/runfiles/MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module(name = "e2e_runfiles")

bazel_dep(name = "aspect_rules_js", version = "0.0.0", dev_dependency = True)
local_path_override(
module_name = "aspect_rules_js",
path = "../..",
)

bazel_dep(name = "aspect_bazel_lib", version = "2.7.7", dev_dependency = True)

npm = use_extension(
"@aspect_rules_js//npm:extensions.bzl",
"npm",
dev_dependency = True,
)
npm.npm_translate_lock(
name = "npm",
npmrc = "//:.npmrc",
pnpm_lock = "//:pnpm-lock.yaml",
verify_node_modules_ignored = "//:.bazelignore",
)
use_repo(npm, "npm")
2 changes: 2 additions & 0 deletions e2e/runfiles/WORKSPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# The presence of this file causes WORKSPACE to be ignored when bzlmod is enabled.
# See https://docs.google.com/document/d/1JtXIVnXyFZ4bmbiBCr5gsTH4-opZAFf5DMMb-54kES0/edit#heading=h.y054fjub9max
10 changes: 10 additions & 0 deletions e2e/runfiles/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "@examples/runfiles",
"private": true,
"dependencies": {
"@bazel/runfiles": "^6.3.0"
},
"pnpm": {
"onlyBuiltDependencies": []
}
}
22 changes: 22 additions & 0 deletions e2e/runfiles/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions e2e/runfiles/pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
packages:
- '.'
73 changes: 73 additions & 0 deletions e2e/runfiles/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
const { join, dirname } = require('path')
const { Runfiles } = require('@bazel/runfiles')

function describe(name, fn) {
console.log(name)
fn()
}
function it(name, fn) {
console.log(` ${name}`)
fn()
}

function assert(t, msg) {
if (!t) {
throw new Error(msg)
}
}

const runfiles = new Runfiles(process.env)

describe('runfile resolution', () => {
it('should properly resolve the files with the module(name)', () => {
const testFixturePath = runfiles.resolve('e2e_runfiles/test_fixture.md')
const expectedPath = join(__dirname, 'test_fixture.md')

assert(
normalizePath(testFixturePath) == normalizePath(expectedPath),
`Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
)
})

it('should properly resolve with forward slashes', () => {
const testFixturePath = runfiles.resolve(
'e2e_runfiles\\test_fixture.md'
)
const expectedPath = join(__dirname, 'test_fixture.md')

assert(
normalizePath(testFixturePath) == normalizePath(expectedPath),
`Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
)
})

it('should properly resolve with the __main__ module alias', () => {
const testFixturePath = runfiles.resolve('__main__/test_fixture.md')
const expectedPath = join(__dirname, 'test_fixture.md')

assert(
normalizePath(testFixturePath) == normalizePath(expectedPath),
`Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
)
})

it('should properly resolve a runfile within a direct module dependency', () => {
const fsPatchPath = runfiles.resolve(
'aspect_rules_js/js/private/node-patches/fs.cjs'
)

assert(!!fsPatchPath, `Expected to find fs patches`)
assert(
fsPatchPath.indexOf('/aspect_rules_js/') == -1,
`Expected to find fs patches in a resolved bzlmod directory`
)
})
})

/**
* Normalizes the delimiters within the specified path. This is useful for test assertions
* where paths might be computed using different path delimiters.
*/
function normalizePath(value) {
return value.replace(/\\/g, '/')
}
1 change: 1 addition & 0 deletions e2e/runfiles/test_fixture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a file part of the sources
23 changes: 23 additions & 0 deletions examples/runfiles/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
load("@aspect_rules_js//js:defs.bzl", "js_test")
load("@npm//:defs.bzl", "npm_link_all_packages")

npm_link_all_packages()

js_test(
name = "runfiles",
data = [
"test_fixture.md",
"test_fixture.md.generated_file_suffix",
":node_modules/@bazel/runfiles",
],
entry_point = "test.js",
)

# Path of file must start similar to `test_fixture.md` in order to regression-test a
# scenario where the runfile resolution would accidentally resolve the path to
# `test_fixture.md` through a runfile manifest entry that starts similarly.
genrule(
name = "gen-data",
outs = ["test_fixture.md.generated_file_suffix"],
cmd = """echo "Generated" > $@""",
)
7 changes: 7 additions & 0 deletions examples/runfiles/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "@examples/runfiles",
"private": true,
"dependencies": {
"@bazel/runfiles": "^6.3.0"
}
}
111 changes: 111 additions & 0 deletions examples/runfiles/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
const { join, dirname } = require('path')
const { Runfiles } = require('@bazel/runfiles')

function describe(name, fn) {
console.log(name)
fn()
}
function it(name, fn) {
console.log(` ${name}`)
fn()
}

function assert(t, msg) {
if (!t) {
throw new Error(msg)
}
}

const runfiles = new Runfiles(process.env)

describe('runfile resolution', () => {
it('should properly resolve the files with the module(name)', () => {
const testFixturePath = runfiles.resolve(
'aspect_rules_js/examples/runfiles/test_fixture.md'
)
const expectedPath = join(__dirname, 'test_fixture.md')

assert(
normalizePath(testFixturePath) == normalizePath(expectedPath),
`Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
)
})

it('should properly resolve with forward slashes', () => {
const testFixturePath = runfiles.resolve(
'aspect_rules_js\\examples\\runfiles\\test_fixture.md'
)
const expectedPath = join(__dirname, 'test_fixture.md')

assert(
normalizePath(testFixturePath) == normalizePath(expectedPath),
`Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
)
})

it('should properly resolve with the __main__ module alias', () => {
const testFixturePath = runfiles.resolve(
'__main__/examples/runfiles/test_fixture.md'
)
const expectedPath = join(__dirname, 'test_fixture.md')

assert(
normalizePath(testFixturePath) == normalizePath(expectedPath),
`Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
)
})

it('should properly resolve a subdirectory of a runfile', () => {
const packagePath = runfiles.resolve('aspect_rules_js/examples')
// Alternate with trailing slash
const packagePath2 = runfiles.resolve('aspect_rules_js/examples/')
const expectedPath = dirname(
dirname(
runfiles.resolve(
'aspect_rules_js/examples/runfiles/test_fixture.md.generated_file_suffix'
)
)
)

assert(
normalizePath(packagePath) == normalizePath(expectedPath),
`Expected to resolve a subdirectory of a runfile: ${packagePath} vs ${expectedPath}`
)
assert(
normalizePath(packagePath2) == normalizePath(expectedPath),
`Expected to resolve a subdirectory of a runfile: ${packagePath2} vs ${expectedPath}`
)
})

it('should properly resolve the workspace root of a runfile', () => {
const packagePath = runfiles.resolve('aspect_rules_js')
// Alternate with trailing slash
const packagePath2 = runfiles.resolve('aspect_rules_js/')
const expectedPath = dirname(
dirname(
dirname(
runfiles.resolve(
'aspect_rules_js/examples/runfiles/test_fixture.md.generated_file_suffix'
)
)
)
)

assert(
normalizePath(packagePath) == normalizePath(expectedPath),
`Expected to resolve the workspace root of a runfile: ${packagePath} vs ${expectedPath}`
)
assert(
normalizePath(packagePath2) == normalizePath(expectedPath),
`Expected to resolve the workspace root of a runfile: ${packagePath2} vs ${expectedPath}`
)
})
})

/**
* Normalizes the delimiters within the specified path. This is useful for test assertions
* where paths might be computed using different path delimiters.
*/
function normalizePath(value) {
return value.replace(/\\/g, '/')
}
1 change: 1 addition & 0 deletions examples/runfiles/test_fixture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a file part of the sources
12 changes: 11 additions & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 0bf6a07

Please sign in to comment.