summaryrefslogtreecommitdiff
path: root/spec/unit/core
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-05-22 09:28:44 -0600
committermo khan <mo.khan@gmail.com>2020-05-25 18:31:06 -0600
commit1ca2a951d05480759af1668ed586793ff5d36a26 (patch)
treeca16267ec26b1d8c3b1a1346a1ab9e8689992116 /spec/unit/core
parentf8092c7f0ad26d04c8137b3b7d4faea5508a53ce (diff)
Convert from using string paths to using Pathname
* Extract a ./bin/run script * Extract defintion for NEWLINE * Add specs for matching yarn.lock * Add specs for Report * Convert package_manager to pathname * Display path in report * matches? to match?
Diffstat (limited to 'spec/unit/core')
-rw-r--r--spec/unit/core/dependency_spec.rb41
-rw-r--r--spec/unit/core/license_plugin_spec.rb17
-rw-r--r--spec/unit/core/path_traversal_spec.rb66
-rw-r--r--spec/unit/core/report_spec.rb17
4 files changed, 124 insertions, 17 deletions
diff --git a/spec/unit/core/dependency_spec.rb b/spec/unit/core/dependency_spec.rb
index 648ade2..4fe328a 100644
--- a/spec/unit/core/dependency_spec.rb
+++ b/spec/unit/core/dependency_spec.rb
@@ -1,30 +1,43 @@
# frozen_string_literal: true
RSpec.describe Spandx::Core::Dependency do
- subject { described_class.new(package_manager: :nuget, name: 'jive', version: '0.1.0') }
+ subject { described_class.new(name: 'jive', version: '0.1.0', path: path) }
- describe '#licenses' do
- specify { expect(subject.licenses).to be_empty }
+ let(:path) { Pathname.new('Gemfile.lock') }
+
+ def build(name, version, path: 'Gemfile.lock')
+ described_class.new(name: name, version: version, path: Pathname.new(path))
end
- describe '#managed_by?' do
- specify { expect(subject).to be_managed_by(:nuget) }
- specify { expect(subject).to be_managed_by('nuget') }
- specify { expect(subject).not_to be_managed_by('rubygems') }
- specify { expect(subject).not_to be_managed_by(nil) }
- specify { expect(subject).not_to be_managed_by(:rubygems) }
+ describe '#licenses' do
+ specify { expect(subject.licenses).to be_empty }
end
describe '<=>' do
- def build(name, version)
- described_class.new(package_manager: :rubygems, name: name, version: version)
- end
-
specify { expect(build('abc', '0.1.0') <=> build('bcd', '0.1.0')).to be < 0 }
+ specify { expect(build('abc', '0.1.0', path: './CHANGELOG.md') <=> build('bcd', '0.1.0', path: 'Gemfile.lock')).to be < 0 }
specify { expect(build('Abc', '0.1.0') <=> build('acd', '0.1.0')).to be < 0 }
specify { expect(build('spandx', '1.0.0') <=> build('spandx', '2.0.0')).to be < 0 }
- specify { expect(build('spandx', '1.0.0') <=> build('spandx', nil)).to be > 0 }
+ specify { expect(build('spandx', '1.0.0') <=> build('spandx', nil)).to be < 0 }
specify { expect(build('spandx', '1.0.0') <=> build(nil, '1.0.0')).to be > 0 }
specify { expect(build('spandx', '1.0.0') <=> nil).to be > 0 }
end
+
+ describe '#eql?' do
+ specify { expect(build('abc', '0.1.0', path: './Gemfile.lock')).to eql(build('abc', '0.1.0', path: './Gemfile.lock')) }
+ specify { expect(build('abc', '0.1.0', path: './Gemfile.lock')).not_to eql(build('abc', '0.1.0', path: './LICENSE.txt')) }
+ specify { expect(build('abc', '0.1.0')).not_to eql(build('abc', '0.2.0')) }
+ specify { expect(build('abc', '0.1.0')).not_to eql(build('xyz', '0.1.0')) }
+ end
+
+ describe '#inspect' do
+ specify { expect(build('abc', '0.1.0', path: path).inspect).to eql("#<#{described_class} name=abc version=0.1.0 path=#{path}>") }
+ end
+
+ describe '#hash' do
+ specify { expect(build('abc', '0.1.0').hash).to eql(build('abc', '0.1.0').hash) }
+ specify { expect(build('abc', '0.1.0', path: Pathname.new('Gemfile.lock')).hash).to eql(build('abc', '0.1.0', path: './Gemfile.lock').hash) }
+ specify { expect(build('abc', '0.1.0').hash).not_to eql(build('abc', '0.0.0').hash) }
+ specify { expect(build('xyz', '0.1.0').hash).not_to eql(build('abc', '0.1.0').hash) }
+ end
end
diff --git a/spec/unit/core/license_plugin_spec.rb b/spec/unit/core/license_plugin_spec.rb
index ed36838..19ed0e6 100644
--- a/spec/unit/core/license_plugin_spec.rb
+++ b/spec/unit/core/license_plugin_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Spandx::Core::LicensePlugin do
describe '#enhance' do
context 'when the dependency is not managed by a known package manager' do
- let(:dependency) { ::Spandx::Core::Dependency.new(package_manager: :unknown, name: 'spandx', version: '0.1.0') }
+ let(:dependency) { ::Spandx::Core::Dependency.new(name: 'spandx', version: '0.1.0', path: Pathname('./logo.gif')) }
specify { expect(subject.enhance(dependency)).to eql(dependency) }
end
@@ -128,7 +128,18 @@ RSpec.describe Spandx::Core::LicensePlugin do
{ package_manager: :yarn, name: 'vary', version: '1.1.2', expected: ['MIT'] },
].each do |item|
context "#{item[:package_manager]}-#{item[:name]}-#{item[:version]}" do
- let(:dependency) { ::Spandx::Core::Dependency.new(package_manager: item[:package_manager], name: item[:name], version: item[:version]) }
+ let(:dependency) { ::Spandx::Core::Dependency.new(path: files[item[:package_manager]], name: item[:name], version: item[:version]) }
+ let(:files) do
+ {
+ composer: fixture_file('composer/composer.lock'),
+ maven: fixture_file('maven/pom.xml'),
+ npm: fixture_file('js/npm/package-lock.json'),
+ nuget: fixture_file('nuget/example.csproj'),
+ pypi: fixture_file('pip/Pipfile.lock'),
+ rubygems: fixture_file('bundler/Gemfile.lock'),
+ yarn: fixture_file('js/yarn.lock')
+ }
+ end
let(:results) do
VCR.use_cassette("#{item[:package_manager]}-#{item[:name]}-#{item[:version]}") do
@@ -141,7 +152,7 @@ RSpec.describe Spandx::Core::LicensePlugin do
end
context 'when the composer dependency metadata includes the detected license' do
- let(:dependency) { ::Spandx::Core::Dependency.new(package_manager: :composer, name: 'spandx/example', version: '0.1.0', meta: { 'license' => ['MIT'] }) }
+ let(:dependency) { ::Spandx::Core::Dependency.new(name: 'spandx/example', version: '0.1.0', path: fixture_file('composer/composer.lock'), meta: { 'license' => ['MIT'] }) }
let(:results) { subject.enhance(dependency).licenses }
it 'skips the network lookup' do
diff --git a/spec/unit/core/path_traversal_spec.rb b/spec/unit/core/path_traversal_spec.rb
new file mode 100644
index 0000000..e9da697
--- /dev/null
+++ b/spec/unit/core/path_traversal_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+RSpec.describe Spandx::Core::PathTraversal do
+ let(:result) do
+ [].tap do |items|
+ subject.each do |item|
+ items << item.to_s
+ end
+ end
+ end
+
+ around do |example|
+ within_tmp_dir do |directory|
+ directory.join('./00/01/02/03/04').mkpath
+ directory.join('./00/01/02/03/04/.04').write('04')
+ directory.join('./00/01/02/03/04/file.04').write('04')
+ directory.join('./00/01/02/03/file.03').write('03')
+ directory.join('./00/01/02/file.02').write('02')
+ directory.join('./00/01/file.01').write('01')
+ directory.join('./00/file.00').write('00')
+ directory.join('./file').write('.')
+
+ example.run
+ end
+ end
+
+ describe '#each' do
+ context 'when traversing a directory non-recursively' do
+ subject { described_class.new(Pathname.pwd, recursive: false) }
+
+ specify do
+ expect(result.map { |x| Pathname.new(x).basename.to_s }).to match_array(['file'])
+ end
+ end
+
+ context 'when traversing a directory recursively' do
+ subject { described_class.new(Pathname.pwd, recursive: true) }
+
+ specify do
+ expect(result.map { |x| Pathname.new(x).basename.to_s }).to match_array([
+ 'file', 'file.00', 'file.01', 'file.02', 'file.03', 'file.04', '.04'
+ ])
+ end
+ end
+
+ context 'when traversing a file non-recursively' do
+ subject { described_class.new(path, recursive: false) }
+
+ let(:path) { Pathname.pwd.join('./file') }
+
+ specify do
+ expect(result.map { |x| Pathname.new(x).basename.to_s }).to match_array(['file'])
+ end
+ end
+
+ context 'when traversing a file recursively' do
+ subject { described_class.new(path, recursive: true) }
+
+ let(:path) { Pathname.pwd.join('./file') }
+
+ specify do
+ expect(result.map { |x| Pathname.new(x).basename.to_s }).to match_array(['file'])
+ end
+ end
+ end
+end
diff --git a/spec/unit/core/report_spec.rb b/spec/unit/core/report_spec.rb
new file mode 100644
index 0000000..d543087
--- /dev/null
+++ b/spec/unit/core/report_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+RSpec.describe Spandx::Core::Report do
+ def build(name, version, path)
+ Spandx::Core::Dependency.new(name: name, version: version, path: path)
+ end
+
+ describe '#dependencies' do
+ before do
+ subject.add(build('spandx', '0.1.0', Pathname('./Gemfile.lock')))
+ subject.add(build('spandx', '0.1.0', Pathname('./Gemfile.lock')))
+ end
+
+ specify { expect(subject.dependencies.count).to be(1) }
+ specify { expect(subject.dependencies.to_a).to eql([build('spandx', '0.1.0', Pathname('./Gemfile.lock'))]) }
+ end
+end