• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 18857434872

27 Oct 2025 10:13PM UTC coverage: 79.932% (-0.3%) from 80.28%
18857434872

Pull #22810

github

web-flow
Merge acd8205fc into 4e54dc0da
Pull Request #22810: CI: update Go SDK version to v1.25.3

0 of 1 new or added line in 1 file covered. (0.0%)

275 existing lines in 13 files now uncovered.

77154 of 96524 relevant lines covered (79.93%)

3.36 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.57
/src/python/pants/backend/javascript/package/rules_test.py
1
# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3
from __future__ import annotations
1✔
4

5
import json
1✔
6
import os.path
1✔
7
import tarfile
1✔
8
import textwrap
1✔
9
from textwrap import dedent
1✔
10
from typing import cast
1✔
11

12
import pytest
1✔
13

14
from pants.backend.javascript import package_json
1✔
15
from pants.backend.javascript.package.rules import (
1✔
16
    GenerateResourcesFromNodeBuildScriptRequest,
17
    NodePackageTarFieldSet,
18
)
19
from pants.backend.javascript.package.rules import rules as package_rules
1✔
20
from pants.backend.javascript.package_json import NPMDistributionTarget
1✔
21
from pants.backend.javascript.target_types import JSSourcesGeneratorTarget, JSSourceTarget
1✔
22
from pants.build_graph.address import Address
1✔
23
from pants.core.goals.package import BuiltPackage
1✔
24
from pants.core.target_types import FilesGeneratorTarget
1✔
25
from pants.engine.internals.native_engine import EMPTY_DIGEST, Digest, Snapshot
1✔
26
from pants.engine.rules import QueryRule
1✔
27
from pants.engine.target import GeneratedSources
1✔
28
from pants.testutil.rule_runner import RuleRunner
1✔
29

30

31
@pytest.fixture(params=["pnpm", "npm", "yarn"])
1✔
32
def package_manager(request) -> str:
1✔
33
    return cast(str, request.param)
1✔
34

35

36
@pytest.fixture
1✔
37
def rule_runner(package_manager: str) -> RuleRunner:
1✔
38
    rule_runner = RuleRunner(
1✔
39
        rules=[
40
            *package_rules(),
41
            QueryRule(BuiltPackage, (NodePackageTarFieldSet,)),
42
            QueryRule(GeneratedSources, (GenerateResourcesFromNodeBuildScriptRequest,)),
43
            QueryRule(Snapshot, (Digest,)),
44
        ],
45
        target_types=[
46
            *package_json.target_types(),
47
            JSSourceTarget,
48
            JSSourcesGeneratorTarget,
49
            NPMDistributionTarget,
50
            FilesGeneratorTarget,
51
        ],
52
        objects=dict(package_json.build_file_aliases().objects),
53
    )
54
    rule_runner.set_options(
1✔
55
        [f"--nodejs-package-manager={package_manager}"],
56
        env_inherit={"PATH"},
57
    )
58
    return rule_runner
1✔
59

60

61
def test_creates_tar_for_package_json(rule_runner: RuleRunner, package_manager: str) -> None:
1✔
62
    rule_runner.write_files(
1✔
63
        {
64
            "src/js/BUILD": dedent(
65
                """\
66
                package_json(dependencies=[":readme"])
67
                files(name="readme", sources=["*.md"])
68

69
                npm_distribution(name="ham-dist")
70
                """
71
            ),
72
            "src/js/package.json": json.dumps(
73
                {"name": "ham", "version": "0.0.1", "browser": "lib/index.mjs"}
74
            ),
75
            "src/js/README.md": "",
76
            "src/js/package-lock.json": json.dumps(
77
                {
78
                    "name": "ham",
79
                    "version": "0.0.1",
80
                    "lockfileVersion": 2,
81
                    "requires": True,
82
                    "packages": {"": {"name": "ham", "version": "0.0.1"}},
83
                }
84
            ),
85
            "src/js/lib/BUILD": dedent(
86
                """\
87
                javascript_sources()
88
                """
89
            ),
90
            "src/js/lib/index.mjs": "",
91
        }
92
    )
93
    tgt = rule_runner.get_target(Address("src/js", target_name="ham-dist"))
1✔
94
    result = rule_runner.request(BuiltPackage, [NodePackageTarFieldSet.create(tgt)])
1✔
95
    rule_runner.write_digest(result.digest)
1✔
96

97
    archive_name = "ham-v0.0.1.tgz" if package_manager == "yarn" else "ham-0.0.1.tgz"
1✔
98
    with tarfile.open(
1✔
99
        os.path.join(rule_runner.build_root, "src.js", "ham-dist", archive_name)
100
    ) as tar:
101
        assert {member.name for member in tar.getmembers()}.issuperset(
1✔
102
            {
103
                "package/package.json",
104
                "package/lib/index.mjs",
105
                "package/README.md",
106
            }
107
        )
108

109

110
def test_packages_files_as_resource(rule_runner: RuleRunner) -> None:
1✔
111
    rule_runner.write_files(
1✔
112
        {
113
            "src/js/BUILD": dedent(
114
                """\
115
                package_json(
116
                    scripts=[
117
                        node_build_script(entry_point="build", output_files=["dist/index.cjs"])
118
                    ]
119
                )
120
                """
121
            ),
122
            "src/js/package.json": json.dumps(
123
                {
124
                    "name": "ham",
125
                    "version": "0.0.1",
126
                    "browser": "lib/index.mjs",
127
                    "scripts": {"build": "mkdir dist && echo 'blarb' >> dist/index.cjs"},
128
                }
129
            ),
130
            "src/js/package-lock.json": json.dumps({}),
131
            "src/js/lib/BUILD": dedent(
132
                """\
133
                javascript_sources()
134
                """
135
            ),
136
            "src/js/lib/index.mjs": "",
137
        }
138
    )
139
    tgt = rule_runner.get_target(Address("src/js", generated_name="build"))
1✔
140
    snapshot = rule_runner.request(Snapshot, (EMPTY_DIGEST,))
1✔
141
    result = rule_runner.request(
1✔
142
        GeneratedSources, [GenerateResourcesFromNodeBuildScriptRequest(snapshot, tgt)]
143
    )
144
    rule_runner.write_digest(result.snapshot.digest)
1✔
145
    with open(os.path.join(rule_runner.build_root, "src/js/dist/index.cjs")) as f:
1✔
146
        assert f.read() == "blarb\n"
1✔
147

148

149
@pytest.fixture
1✔
150
def workspace_files(package_manager: str) -> dict[str, str]:
1✔
151
    if package_manager == "npm":
1✔
152
        return {
1✔
153
            "src/js/package-lock.json": json.dumps(
154
                {
155
                    "name": "spam",
156
                    "version": "0.0.1",
157
                    "lockfileVersion": 2,
158
                    "requires": True,
159
                    "dependencies": {"ham": {"version": "file:a"}},
160
                    "packages": {
161
                        "": {"name": "spam", "version": "0.0.1", "workspaces": ["a"]},
162
                        "a": {"name": "ham", "version": "0.0.1"},
163
                        "node_modules/ham": {"link": True, "resolved": "a"},
164
                    },
165
                }
166
            )
167
        }
168
    if package_manager == "pnpm":
1✔
169
        return {
1✔
170
            "src/js/pnpm-workspace.yaml": json.dumps(
171
                {
172
                    "packages": ["a"],
173
                }
174
            ),
175
            "src/js/pnpm-lock.yaml": json.dumps(
176
                {
177
                    "importers": {
178
                        ".": {},
179
                        "a": {},
180
                    },
181
                    "lockfileVersion": "9.0",
182
                }
183
            ),
184
        }
185
    if package_manager == "yarn":
1✔
186
        return {
1✔
187
            "src/js/yarn.lock": textwrap.dedent(
188
                """\
189
                # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
190
                # yarn lockfile v1
191

192

193
                """
194
            )
195
        }
UNCOV
196
    raise AssertionError(f"No lockfile implemented for {package_manager}.")
×
197

198

199
def test_packages_files_as_resource_in_workspace(
1✔
200
    rule_runner: RuleRunner,
201
    workspace_files: dict[str, str],
202
) -> None:
203
    rule_runner.write_files(
1✔
204
        {
205
            **workspace_files,
206
            "src/js/package.json": json.dumps(
207
                {
208
                    "name": "spam",
209
                    "version": "0.0.1",
210
                    "workspaces": ["a"],
211
                    "private": True,
212
                }
213
            ),
214
            "src/js/BUILD": "package_json()",
215
            "src/js/a/BUILD": dedent(
216
                """\
217
                package_json(
218
                    scripts=[
219
                        node_build_script(entry_point="build", output_files=["dist/index.cjs"])
220
                    ]
221
                )
222
                """
223
            ),
224
            "src/js/a/package.json": json.dumps(
225
                {
226
                    "name": "ham",
227
                    "version": "0.0.1",
228
                    "browser": "lib/index.mjs",
229
                    "scripts": {"build": "mkdir dist && echo 'blarb' >> dist/index.cjs"},
230
                }
231
            ),
232
            "src/js/a/lib/BUILD": dedent(
233
                """\
234
                javascript_sources()
235
                """
236
            ),
237
            "src/js/a/lib/index.mjs": "",
238
        }
239
    )
240
    tgt = rule_runner.get_target(Address("src/js/a", generated_name="build"))
1✔
241
    snapshot = rule_runner.request(Snapshot, (EMPTY_DIGEST,))
1✔
242
    result = rule_runner.request(
1✔
243
        GeneratedSources, [GenerateResourcesFromNodeBuildScriptRequest(snapshot, tgt)]
244
    )
245
    rule_runner.write_digest(result.snapshot.digest)
1✔
246
    with open(os.path.join(rule_runner.build_root, "src/js/a/dist/index.cjs")) as f:
1✔
247
        assert f.read() == "blarb\n"
1✔
248

249

250
def test_extra_envs(rule_runner: RuleRunner) -> None:
1✔
251
    rule_runner.set_options(
1✔
252
        [
253
            "--nodejs-extra-env-vars=['FROM_SUBSYSTEM=FIZZ']",
254
        ],
255
        env_inherit={"PATH"},
256
    )
257
    rule_runner.write_files(
1✔
258
        {
259
            "src/js/BUILD": dedent(
260
                """\
261
                package_json(
262
                    scripts=[
263
                        node_build_script(entry_point="build", extra_env_vars=["FOO=BAR"], output_files=["dist/index.cjs"])
264
                    ],
265
                    extra_env_vars=["FROM_PACKAGE_JSON=BUZZ"]
266
                )
267
                """
268
            ),
269
            "src/js/package.json": json.dumps(
270
                {
271
                    "name": "ham",
272
                    "version": "0.0.1",
273
                    "browser": "lib/index.mjs",
274
                    "scripts": {
275
                        "build": "mkdir dist && echo $FOO >> dist/index.cjs && echo $FROM_SUBSYSTEM >> dist/index.cjs && echo $FROM_PACKAGE_JSON >> dist/index.cjs"
276
                    },
277
                }
278
            ),
279
            "src/js/package-lock.json": json.dumps({}),
280
            "src/js/lib/BUILD": dedent(
281
                """\
282
                javascript_sources()
283
                """
284
            ),
285
            "src/js/lib/index.mjs": "",
286
        }
287
    )
288
    tgt = rule_runner.get_target(Address("src/js", generated_name="build"))
1✔
289
    snapshot = rule_runner.request(Snapshot, (EMPTY_DIGEST,))
1✔
290
    result = rule_runner.request(
1✔
291
        GeneratedSources, [GenerateResourcesFromNodeBuildScriptRequest(snapshot, tgt)]
292
    )
293
    rule_runner.write_digest(result.snapshot.digest)
1✔
294
    with open(os.path.join(rule_runner.build_root, "src/js/dist/index.cjs")) as f:
1✔
295
        assert f.read() == "BAR\nFIZZ\nBUZZ\n"
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc