@@ -51,8 +51,8 @@ def setUpTestData(self):
5151 with open (os .path .join (TEST_DATA , 'debian.json' )) as f :
5252 test_data = json .load (f )
5353
54- extract_data = debian .extract_vulnerabilities (test_data )
55- debian_dump (extract_data )
54+ self . extract_data = debian .extract_vulnerabilities (test_data )
55+ debian_dump (self . extract_data )
5656
5757 def test_Vulnerability (self ):
5858 """
@@ -83,9 +83,7 @@ def test_Package(self):
8383 """
8484 Check that all packages from the test data are stored in the database
8585 """
86- # There are five rows in Package because currently the models allow duplicates
87- # (see issue #28).
88- self .assertEqual (5 , Package .objects .count ())
86+ self .assertEqual (3 , Package .objects .count ())
8987
9088 self .assertTrue (Package .objects .filter (name = 'mimetex' ))
9189 self .assertTrue (Package .objects .get (name = 'librsync' ))
@@ -114,15 +112,33 @@ def test_ResolvedPackage(self):
114112 self .assertIn ('1.50-1.1' , versions )
115113 self .assertIn ('1.74-1' , versions )
116114
115+ def test_debian_data_dump_twice (self ):
116+ """
117+ Scrape data from Debian' main tracker, save it
118+ in the database and verify entries.
119+ """
120+ debian_dump (self .extract_data )
121+
122+ self .assertEqual (3 , Vulnerability .objects .count ())
123+ self .assertEqual (3 , VulnerabilityReference .objects .count ())
124+ self .assertEqual (3 , Package .objects .count ())
125+
126+ # Dumping the data twice doesn't create new objects.
127+ debian_dump (self .extract_data )
128+
129+ self .assertEqual (3 , Vulnerability .objects .count ())
130+ self .assertEqual (3 , VulnerabilityReference .objects .count ())
131+ self .assertEqual (3 , Package .objects .count ())
132+
117133
118134class TestUbuntuDataDump (TestCase ):
119135 @classmethod
120136 def setUpTestData (self ):
121137 with open (os .path .join (TEST_DATA , 'ubuntu_main.html' )) as f :
122138 test_data = f .read ()
123139
124- data = ubuntu .extract_cves (test_data )
125- ubuntu_dump (data )
140+ self . data = ubuntu .extract_cves (test_data )
141+ ubuntu_dump (self . data )
126142
127143 def test_data_dump (self ):
128144 """
@@ -132,15 +148,32 @@ def test_data_dump(self):
132148 self .assertEqual (reference .reference_id , 'CVE-2002-2439' )
133149 self .assertTrue (Package .objects .filter (name = 'gcc-4.6' )[0 ].name , 'gcc-4.6' )
134150
151+ def test_ubuntu_data_dump_twice (self ):
152+ """
153+ Scrape data from Ubuntu twice from main tracker, save it
154+ in the database and verify single time entry.
155+ """
156+ ubuntu_dump (self .data )
157+ count = Package .objects .all ().count ()
158+ reference = VulnerabilityReference .objects .filter (
159+ reference_id = 'CVE-2002-2439' )
160+ self .assertEqual (reference [0 ].reference_id , 'CVE-2002-2439' )
161+ self .assertTrue (Package .objects .filter (name = 'gcc-4.6' )[0 ].name ,
162+ 'gcc-4.6' )
163+
164+ # Dumping the data twice doesn't create new objects.
165+ ubuntu_dump (self .data )
166+ self .assertEqual (count , Package .objects .all ().count ())
167+
135168
136169class TestArchLinuxDataDump (TestCase ):
137170
138171 @classmethod
139172 def setUpTestData (self ):
140173 with open (os .path .join (TEST_DATA , 'archlinux.json' )) as f :
141- test_data = json .load (f )
174+ self . test_data = json .load (f )
142175
143- archlinux_dump (test_data )
176+ archlinux_dump (self . test_data )
144177
145178 def test_Vulnerability (self ):
146179 """
@@ -190,3 +223,25 @@ def test_ResolvedPackage(self):
190223
191224 self .assertEqual (4 , len (resolved_pkgs ))
192225 self .assertEqual ('2.6.1-1' , resolved_pkg .package .version )
226+
227+ def test_archlinux_data_dump_twice (self ):
228+ """
229+ Scrape data from Archlinux' main tracker twice, save it
230+ in the database and verify no multiple entries.
231+ """
232+ archlinux_dump (self .test_data )
233+ self .assertEqual (1 , Vulnerability .objects .count ())
234+ self .assertEqual (14 , VulnerabilityReference .objects .count ())
235+ self .assertEqual (8 , Package .objects .count ())
236+ self .assertEqual (8 , PackageReference .objects .count ())
237+ self .assertEqual (4 , ImpactedPackage .objects .count ())
238+ self .assertEqual (4 , ResolvedPackage .objects .count ())
239+
240+ # Dumping the data twice doesn't create new objects.
241+ archlinux_dump (self .test_data )
242+ self .assertEqual (1 , Vulnerability .objects .count ())
243+ self .assertEqual (14 , VulnerabilityReference .objects .count ())
244+ self .assertEqual (8 , Package .objects .count ())
245+ self .assertEqual (8 , PackageReference .objects .count ())
246+ self .assertEqual (4 , ImpactedPackage .objects .count ())
247+ self .assertEqual (4 , ResolvedPackage .objects .count ())
0 commit comments