Skip to content

Commit

Permalink
Adding tests cases to file parser and updater
Browse files Browse the repository at this point in the history
  • Loading branch information
robaiken committed Jan 28, 2025
1 parent 74757bb commit c5691f2
Show file tree
Hide file tree
Showing 9 changed files with 376 additions and 3 deletions.
8 changes: 5 additions & 3 deletions npm_and_yarn/lib/dependabot/npm_and_yarn/file_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,7 @@ def parse
dependency_set = DependencySet.new
dependency_set += manifest_dependencies
dependency_set += lockfile_dependencies
if pnpm_workspace_yml && Dependabot::Experiments.enabled?(:enable_pnpm_workspace_catalog)
dependency_set += workspace_catalog_dependencies
end
dependency_set += workspace_catalog_dependencies if enable_pnpm_workspace_catalog?

dependencies = Helpers.dependencies_with_all_versions_metadata(dependency_set)

Expand Down Expand Up @@ -98,6 +96,10 @@ def ecosystem

private

def enable_pnpm_workspace_catalog?
pnpm_workspace_yml && Dependabot::Experiments.enabled?(:enable_pnpm_workspace_catalog)
end

sig { returns(PackageManagerHelper) }
def package_manager_helper
@package_manager_helper ||= T.let(
Expand Down
74 changes: 74 additions & 0 deletions npm_and_yarn/spec/dependabot/npm_and_yarn/file_parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
.with(:npm_v6_deprecation_warning).and_return(true)
allow(Dependabot::Experiments).to receive(:enabled?)
.with(:enable_fix_for_pnpm_no_change_error).and_return(true)
allow(Dependabot::Experiments).to receive(:enabled?)
.with(:enable_pnpm_workspace_catalog).and_return(true)
end

after do
Expand Down Expand Up @@ -1543,6 +1545,78 @@
end
end
end

context "with pnpm catalog protocol" do
let(:files) { project_dependency_files("pnpm/catalogs_all_examples") }

its(:length) { is_expected.to eq(6) }

it "parses the dependency" do
expect(top_level_dependencies.map(&:name)).to eq(%w(
react-icons
prettier
express
is-even
react
react-dom
))
end

it "parses the dependency requirements" do
expected_dependencies = [
{
name: "react-icons",
version: "4.3.1",
requirements: [
{ requirement: "4.3.1", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil }
]
},
{
name: "prettier",
version: "3.3.0",
requirements: [
{ requirement: "3.3.0", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil }
]
},
{
name: "express",
version: "4.15.2",
requirements: [
{ requirement: "4.15.2", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil }
]
},
{
name: "is-even",
version: "0.1.2",
requirements: [
{ requirement: "0.1.2", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil }
]
},
{
name: "react",
version: "16.0.0",
requirements: [
{ requirement: "^18.0.0", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil },
{ requirement: "16.0.0", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil }
]
},
{
name: "react-dom",
version: "18.0.0",
requirements: [
{ requirement: "18.0.0", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil },
{ requirement: "^16.2.0", file: "pnpm-workspace.yaml", groups: ["dependencies"], source: nil }
]
}
]

expected_dependencies.each_with_index do |expected, index|
expect(dependencies[index].name).to eq(expected[:name])
expect(dependencies[index].version).to eq(expected[:version])
expect(dependencies[index].requirements).to eq(expected[:requirements])
end
end
end
end

describe "sub-dependencies" do
Expand Down
226 changes: 226 additions & 0 deletions npm_and_yarn/spec/dependabot/npm_and_yarn/file_updater_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3829,6 +3829,10 @@
updated_files.find { |f| f.name == "pnpm-lock.yaml" }
end

let(:updated_pnpm_workspace) do
updated_files.find { |f| f.name == "pnpm-workspace.yaml" }
end

let(:repo_contents_path) { build_tmp_repo(project_name, path: "projects") }
let(:files) { project_dependency_files(project_name) }

Expand Down Expand Up @@ -4137,6 +4141,228 @@
expect(updated_pnpm_lock.content).to include("[email protected]:")
end
end

context "with pnpm catalog protocol" do
context "when individual dependency needs updating" do
let(:project_name) { "pnpm/catalog_prettier" }

let(:dependency_name) { "prettier" }
let(:version) { "3.3.3" }
let(:previous_version) { "3.3.0" }

it "updates the workspace" do
expect(updated_files.map(&:name)).to eq(%w(pnpm-workspace.yaml))

expect(updated_pnpm_workspace.content).to include("prettier: 3.3.3")
end
end

context "when updating multiple dependencies in catalogs" do
let(:project_name) { "pnpm/catalogs_all_examples" }

let(:dependencies) do
[
Dependabot::Dependency.new(
name: "react",
version: "18.2.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.2.0",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.0.0",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "react-dom",
version: "18.2.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.2.0",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.0.0",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "react",
version: "16.2.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^16.2.0",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^16.0.0",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "react-dom",
version: "16.2.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^16.2.0",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^16.0.0",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "react-icons",
version: "4.3.1",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "4.3.1",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "4.3.14",
groups: [],
source: nil
}]
)
]
end

it "updates the workspace file" do
expect(updated_pnpm_workspace.content).to include("react-icons: 4.3.14")
expect(updated_pnpm_workspace.content).to include("react: ^18.2.0")
expect(updated_pnpm_workspace.content).to include("react-dom: ^18.2.0")
expect(updated_pnpm_workspace.content).to include("react: ^16.2.0")
expect(updated_pnpm_workspace.content).to include("react-dom: ^16.2.0")
end
end

context "when updating multiple dependencies with valid yaml" do
let(:project_name) { "pnpm/catalogs_valid_yaml" }

let(:dependencies) do
[
Dependabot::Dependency.new(
name: "prettier",
version: "3.3.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "3.3.3",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "3.3.0",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "express",
version: "4.15.2",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "4.21.2",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "4.15.2",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "is-even",
version: "0.1.2",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "1.0.0",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "0.1.2",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "react",
version: "18.0.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.2.3",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.0.0",
groups: [],
source: nil
}]
),
Dependabot::Dependency.new(
name: "react-dom",
version: "18.0.0",
package_manager: "npm_and_yarn",
requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.2.3",
groups: [],
source: nil
}],
previous_requirements: [{
file: "pnpm-workspace.yaml",
requirement: "^18.0.0",
groups: [],
source: nil
}]
)
]
end

it "updates the workspace" do
expect(updated_files.map(&:name)).to eq(%w(pnpm-workspace.yaml))

expect(updated_pnpm_workspace.content).to include("prettier: \"3.3.3\"")
expect(updated_pnpm_workspace.content).to include("\"express\": 4.21.2")
expect(updated_pnpm_workspace.content).to include("is-even: '1.0.0'")
expect(updated_pnpm_workspace.content).to include("react: \"^18.2.3\"")
expect(updated_pnpm_workspace.content).to include("react-dom: '^18.2.3'")
end
end
end
end
end

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"dependencies": {
},
"devDependencies": {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"dependencies": {
},
"devDependencies": {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"dependencies": {
},
"devDependencies": {
}
}
Loading

0 comments on commit c5691f2

Please sign in to comment.