@@ -111,4 +111,150 @@ def test_branch_commit_associations
111111 assert_includes branch . commits , commit
112112 assert_includes commit . branches , branch
113113 end
114+
115+ def test_dependency_change_purl_from_lockfile
116+ repo = Git ::Pkgs ::Repository . new ( @test_dir )
117+ rugged_commit = repo . walk ( "main" ) . first
118+ commit = Git ::Pkgs ::Models ::Commit . find_or_create_from_rugged ( rugged_commit )
119+
120+ manifest = Git ::Pkgs ::Models ::Manifest . find_or_create (
121+ path : "Gemfile.lock" ,
122+ ecosystem : "rubygems" ,
123+ kind : "lockfile"
124+ )
125+
126+ change = Git ::Pkgs ::Models ::DependencyChange . create (
127+ commit : commit ,
128+ manifest : manifest ,
129+ name : "rails" ,
130+ ecosystem : "rubygems" ,
131+ change_type : "added" ,
132+ requirement : "7.0.0"
133+ )
134+
135+ assert_equal "pkg:gem/rails@7.0.0" , change . purl . to_s
136+ assert_equal "pkg:gem/rails" , change . purl ( with_version : false ) . to_s
137+ end
138+
139+ def test_dependency_change_purl_from_manifest_omits_version
140+ repo = Git ::Pkgs ::Repository . new ( @test_dir )
141+ rugged_commit = repo . walk ( "main" ) . first
142+ commit = Git ::Pkgs ::Models ::Commit . find_or_create_from_rugged ( rugged_commit )
143+
144+ manifest = Git ::Pkgs ::Models ::Manifest . find_or_create (
145+ path : "Gemfile" ,
146+ ecosystem : "rubygems" ,
147+ kind : "manifest"
148+ )
149+
150+ change = Git ::Pkgs ::Models ::DependencyChange . create (
151+ commit : commit ,
152+ manifest : manifest ,
153+ name : "rails" ,
154+ ecosystem : "rubygems" ,
155+ change_type : "added" ,
156+ requirement : "~> 7.0"
157+ )
158+
159+ assert_equal "pkg:gem/rails" , change . purl . to_s
160+ end
161+
162+ def test_dependency_snapshot_purl_from_lockfile
163+ repo = Git ::Pkgs ::Repository . new ( @test_dir )
164+ rugged_commit = repo . walk ( "main" ) . first
165+ commit = Git ::Pkgs ::Models ::Commit . find_or_create_from_rugged ( rugged_commit )
166+
167+ manifest = Git ::Pkgs ::Models ::Manifest . find_or_create (
168+ path : "package-lock.json" ,
169+ ecosystem : "npm" ,
170+ kind : "lockfile"
171+ )
172+
173+ snapshot = Git ::Pkgs ::Models ::DependencySnapshot . create (
174+ commit : commit ,
175+ manifest : manifest ,
176+ name : "lodash" ,
177+ ecosystem : "npm" ,
178+ requirement : "4.17.21"
179+ )
180+
181+ assert_equal "pkg:npm/lodash@4.17.21" , snapshot . purl . to_s
182+ assert_equal "pkg:npm/lodash" , snapshot . purl ( with_version : false ) . to_s
183+ end
184+
185+ def test_package_creation
186+ package = Git ::Pkgs ::Models ::Package . create (
187+ purl : "pkg:gem/rails" ,
188+ latest_version : "7.1.0" ,
189+ license : "MIT" ,
190+ description : "Full-stack web framework" ,
191+ source : "ecosystems"
192+ )
193+
194+ assert_equal "pkg:gem/rails" , package . purl
195+ assert_equal "7.1.0" , package . latest_version
196+ assert_equal "MIT" , package . license
197+ assert_equal "ecosystems" , package . source
198+ end
199+
200+ def test_package_parsed_purl
201+ package = Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
202+
203+ assert_equal "gem" , package . parsed_purl . type
204+ assert_equal "rails" , package . parsed_purl . name
205+ end
206+
207+ def test_package_enriched
208+ package = Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
209+ refute package . enriched?
210+
211+ package . update ( enriched_at : Time . now )
212+ assert package . enriched?
213+ end
214+
215+ def test_version_creation
216+ Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
217+
218+ version = Git ::Pkgs ::Models ::Version . create (
219+ purl : "pkg:gem/rails@7.0.0" ,
220+ package_purl : "pkg:gem/rails" ,
221+ license : "MIT" ,
222+ published_at : Time . parse ( "2021-12-15" ) ,
223+ integrity : "sha256:abc123" ,
224+ source : "ecosystems"
225+ )
226+
227+ assert_equal "pkg:gem/rails@7.0.0" , version . purl
228+ assert_equal "pkg:gem/rails" , version . package_purl
229+ assert_equal "7.0.0" , version . version_string
230+ end
231+
232+ def test_version_belongs_to_package
233+ package = Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
234+
235+ version = Git ::Pkgs ::Models ::Version . create (
236+ purl : "pkg:gem/rails@7.0.0" ,
237+ package_purl : "pkg:gem/rails"
238+ )
239+
240+ assert_equal package . id , version . package . id
241+ assert_includes package . versions . map ( &:id ) , version . id
242+ end
243+
244+ def test_package_purl_uniqueness
245+ Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
246+
247+ assert_raises ( Sequel ::UniqueConstraintViolation ) do
248+ Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
249+ end
250+ end
251+
252+ def test_version_purl_uniqueness
253+ Git ::Pkgs ::Models ::Package . create ( purl : "pkg:gem/rails" )
254+ Git ::Pkgs ::Models ::Version . create ( purl : "pkg:gem/rails@7.0.0" , package_purl : "pkg:gem/rails" )
255+
256+ assert_raises ( Sequel ::UniqueConstraintViolation ) do
257+ Git ::Pkgs ::Models ::Version . create ( purl : "pkg:gem/rails@7.0.0" , package_purl : "pkg:gem/rails" )
258+ end
259+ end
114260end
0 commit comments