11// Copyright 2025 Dotanuki Labs
22// SPDX-License-Identifier: MIT
33
4- use crate :: core:: { CrateInfo , TruthfulnessEvaluation } ;
4+ use crate :: core:: { CrateInfo , VeracityEvaluation } ;
55use crate :: infra:: HTTPClient ;
66use serde:: Deserialize ;
77use std:: fmt:: Display ;
@@ -44,7 +44,7 @@ impl CratesIOEvaluator {
4444 }
4545}
4646
47- impl TruthfulnessEvaluation for CratesIOEvaluator {
47+ impl VeracityEvaluation for CratesIOEvaluator {
4848 async fn evaluate ( & self , crate_info : & CrateInfo ) -> anyhow:: Result < bool > {
4949 let endpoint = format ! (
5050 "{}/api/v1/crates/{}/{}" ,
@@ -72,10 +72,10 @@ impl TruthfulnessEvaluation for CratesIOEvaluator {
7272
7373#[ cfg( test) ]
7474mod tests {
75- use crate :: core:: { CrateInfo , TruthfulnessEvaluation } ;
75+ use crate :: core:: { CrateInfo , VeracityEvaluation } ;
7676 use crate :: infra:: cratesio:: CratesIOEvaluator ;
7777 use crate :: infra:: factories;
78- use assertor:: BooleanAssertion ;
78+ use assertor:: { BooleanAssertion , ResultAssertion } ;
7979 use httpmock:: { MockServer , Then , When } ;
8080
8181 fn responds_with_existing_provenance ( crate_name : & str , crate_version : & str ) -> impl FnOnce ( When , Then ) {
@@ -135,15 +135,28 @@ mod tests {
135135 }
136136 }
137137
138+ fn responds_without_server_error ( crate_name : & str , crate_version : & str ) -> impl FnOnce ( When , Then ) {
139+ move |when, then| {
140+ when. method ( "GET" )
141+ . path ( format ! ( "/api/v1/crates/{}/{}" , crate_name, crate_version) ) ;
142+
143+ then. status ( 503 )
144+ . header ( "content-type" , "application/text; charset=UTF-8" )
145+ . body ( "internal error" ) ;
146+ }
147+ }
148+
138149 #[ tokio:: test]
139- async fn should_evaluate_provenance_when_available ( ) {
150+ async fn should_evaluate_crate_provenance_when_available ( ) {
151+ let crate_name = "bon" ;
152+ let crate_version = "3.7.2" ;
153+ let crate_info = CrateInfo :: with ( crate_name, crate_version) ;
154+
140155 let mock_server = MockServer :: start ( ) ;
141156 let evaluator = CratesIOEvaluator :: new ( mock_server. base_url ( ) , factories:: HTTP_CLIENT . clone ( ) ) ;
142157
143- let response_with_provenance = responds_with_existing_provenance ( "bon" , "3.7.2" ) ;
144-
145- let mocked = mock_server. mock ( response_with_provenance) ;
146- let crate_info = CrateInfo :: new ( "bon" . to_string ( ) , "3.7.2" . to_string ( ) ) ;
158+ let with_provenance = responds_with_existing_provenance ( crate_name, crate_version) ;
159+ let mocked = mock_server. mock ( with_provenance) ;
147160
148161 let evaluation = evaluator. evaluate ( & crate_info) . await . unwrap ( ) ;
149162
@@ -152,19 +165,39 @@ mod tests {
152165 }
153166
154167 #[ tokio:: test]
155- async fn should_evaluate_provenance_when_not_available ( ) {
168+ async fn should_evaluate_crate_provenance_when_not_available ( ) {
169+ let crate_name = "canopus" ;
170+ let crate_version = "0.1.1" ;
171+ let crate_info = CrateInfo :: with ( crate_name, crate_version) ;
172+
156173 let mock_server = MockServer :: start ( ) ;
157174 let evaluator = CratesIOEvaluator :: new ( mock_server. base_url ( ) , factories:: HTTP_CLIENT . clone ( ) ) ;
158175
159- let response_without_provenance = responds_without_provenance ( "canopus" , "0.1.1" ) ;
160-
161- let mocked = mock_server. mock ( response_without_provenance) ;
176+ let without_provenance = responds_without_provenance ( crate_name, crate_version) ;
162177
163- let crate_info = CrateInfo :: new ( "canopus" . to_string ( ) , "0.1.1" . to_string ( ) ) ;
178+ let mocked = mock_server . mock ( without_provenance ) ;
164179
165180 let evaluation = evaluator. evaluate ( & crate_info) . await . unwrap ( ) ;
166181
167182 mocked. assert ( ) ;
168183 assertor:: assert_that!( evaluation) . is_false ( )
169184 }
185+
186+ #[ tokio:: test]
187+ async fn should_evaluate_provenance_when_server_not_available ( ) {
188+ let crate_name = "canopus" ;
189+ let crate_version = "0.0.1" ;
190+ let crate_info = CrateInfo :: with ( crate_name, crate_version) ;
191+
192+ let mock_server = MockServer :: start ( ) ;
193+ let evaluator = CratesIOEvaluator :: new ( mock_server. base_url ( ) , factories:: HTTP_CLIENT . clone ( ) ) ;
194+
195+ let not_found = responds_without_server_error ( crate_name, crate_version) ;
196+ let mocked = mock_server. mock ( not_found) ;
197+
198+ let evaluation = evaluator. evaluate ( & crate_info) . await ;
199+
200+ mocked. assert ( ) ;
201+ assertor:: assert_that!( evaluation) . is_err ( )
202+ }
170203}
0 commit comments