Skip to content

Commit 779d404

Browse files
benev0lpil
authored andcommitted
add tests for get_repository_versions_data & get_package_data
1 parent 53bdf51 commit 779d404

File tree

2 files changed

+191
-108
lines changed

2 files changed

+191
-108
lines changed

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,10 @@ impl ApiError {
754754
pub fn is_not_found(&self) -> bool {
755755
matches!(self, Self::NotFound)
756756
}
757+
758+
pub fn is_invalid_protobuf(&self) -> bool {
759+
matches!(self, Self::InvalidProtobuf(_))
760+
}
757761
}
758762

759763
/// Read a body and ensure it has the given sha256 digest.

src/tests.rs

Lines changed: 187 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// TODO: remove all the async stuff and mockito server. The library is pure now
22
// so it isn't needed.
33

4-
use std::convert::TryFrom;
4+
use std::{convert::TryFrom, io::Cursor};
55

66
use super::*;
77
use mockito::Matcher;
@@ -801,6 +801,116 @@ async fn publish_docs_forbidden() {
801801
mock.assert();
802802
}
803803

804+
fn expected_package_exfmt() -> Package {
805+
Package {
806+
name: "exfmt".to_string(),
807+
repository: "hexpm".to_string(),
808+
releases: vec![
809+
Release {
810+
version: Version::try_from("0.0.0").unwrap(),
811+
requirements: [].into(),
812+
retirement_status: None,
813+
outer_checksum: vec![
814+
82, 48, 191, 145, 92, 172, 0, 108, 238, 71, 57, 23, 101, 177, 161, 83, 91,
815+
182, 18, 232, 249, 225, 29, 12, 246, 5, 215, 165, 32, 57, 179, 110
816+
],
817+
meta: (),
818+
},
819+
Release {
820+
version: Version::try_from("0.1.0").unwrap(),
821+
requirements: [].into(),
822+
retirement_status: None,
823+
outer_checksum: vec![
824+
111, 246, 240, 176, 118, 229, 12, 15, 164, 61, 186, 3, 89, 106, 153, 225,
825+
247, 52, 245, 8, 216, 139, 21, 232, 200, 16, 214, 59, 241, 188, 9, 6
826+
],
827+
meta: (),
828+
},
829+
Release {
830+
version: Version::try_from("0.2.0").unwrap(),
831+
requirements: [].into(),
832+
retirement_status: None,
833+
outer_checksum: vec![
834+
149, 9, 192, 229, 84, 162, 110, 207, 161, 43, 31, 0, 126, 168, 14, 243, 31,
835+
43, 195, 238, 100, 91, 78, 100, 213, 181, 101, 154, 106, 168, 170, 107
836+
],
837+
meta: (),
838+
},
839+
Release {
840+
version: Version::try_from("0.2.1").unwrap(),
841+
requirements: [].into(),
842+
retirement_status: None,
843+
outer_checksum: vec![
844+
157, 229, 28, 212, 92, 249, 14, 240, 235, 104, 31, 12, 160, 199, 83, 195,
845+
154, 105, 222, 37, 221, 80, 181, 183, 113, 240, 234, 107, 144, 85, 255, 65
846+
],
847+
meta: (),
848+
},
849+
Release {
850+
version: Version::try_from("0.2.2").unwrap(),
851+
requirements: [].into(),
852+
retirement_status: None,
853+
outer_checksum: vec![
854+
112, 250, 133, 189, 183, 192, 54, 218, 115, 55, 216, 97, 204, 201, 191,
855+
168, 250, 133, 138, 252, 202, 240, 74, 197, 228, 235, 81, 18, 241, 7, 155,
856+
38
857+
],
858+
meta: (),
859+
},
860+
Release {
861+
version: Version::try_from("0.2.3").unwrap(),
862+
requirements: [].into(),
863+
retirement_status: None,
864+
outer_checksum: vec![
865+
131, 20, 29, 160, 171, 124, 7, 125, 210, 88, 17, 189, 199, 49, 191, 190,
866+
14, 162, 38, 247, 52, 176, 189, 17, 7, 188, 151, 152, 24, 64, 170, 29
867+
],
868+
meta: (),
869+
},
870+
Release {
871+
version: Version::try_from("0.2.4").unwrap(),
872+
requirements: [].into(),
873+
retirement_status: None,
874+
outer_checksum: vec![
875+
109, 162, 185, 169, 26, 4, 62, 60, 167, 54, 182, 161, 140, 197, 75, 113,
876+
183, 117, 247, 201, 218, 228, 14, 160, 115, 157, 196, 51, 108, 16, 96, 217
877+
],
878+
meta: (),
879+
},
880+
Release {
881+
version: Version::try_from("0.3.0").unwrap(),
882+
requirements: [].into(),
883+
retirement_status: None,
884+
outer_checksum: vec![
885+
97, 50, 95, 212, 242, 59, 245, 177, 140, 78, 79, 180, 108, 174, 119, 176,
886+
24, 80, 218, 152, 178, 227, 152, 242, 32, 126, 72, 67, 222, 0, 173, 170
887+
],
888+
meta: (),
889+
},
890+
Release {
891+
version: Version::try_from("0.4.0").unwrap(),
892+
requirements: [].into(),
893+
retirement_status: None,
894+
outer_checksum: vec![
895+
246, 178, 237, 214, 217, 158, 143, 52, 130, 186, 64, 50, 94, 175, 161, 81,
896+
68, 186, 4, 73, 53, 226, 235, 144, 209, 84, 231, 136, 165, 119, 122, 126
897+
],
898+
meta: (),
899+
},
900+
Release {
901+
version: Version::try_from("0.5.0").unwrap(),
902+
requirements: [].into(),
903+
retirement_status: None,
904+
outer_checksum: vec![
905+
151, 86, 157, 218, 218, 131, 240, 119, 198, 216, 202, 240, 65, 17, 57, 228,
906+
84, 252, 59, 207, 246, 49, 22, 21, 52, 47, 51, 139, 190, 9, 95, 109
907+
],
908+
meta: (),
909+
}
910+
],
911+
}
912+
}
913+
804914
#[tokio::test]
805915
async fn get_package_ok_test() {
806916
let response_body = std::include_bytes!("../test/package_exfmt");
@@ -828,113 +938,7 @@ async fn get_package_ok_test() {
828938
.unwrap();
829939

830940
assert_eq!(
831-
Package {
832-
name: "exfmt".to_string(),
833-
repository: "hexpm".to_string(),
834-
releases: vec![
835-
Release {
836-
version: Version::try_from("0.0.0").unwrap(),
837-
requirements: [].into(),
838-
retirement_status: None,
839-
outer_checksum: vec![
840-
82, 48, 191, 145, 92, 172, 0, 108, 238, 71, 57, 23, 101, 177, 161, 83, 91,
841-
182, 18, 232, 249, 225, 29, 12, 246, 5, 215, 165, 32, 57, 179, 110
842-
],
843-
meta: (),
844-
},
845-
Release {
846-
version: Version::try_from("0.1.0").unwrap(),
847-
requirements: [].into(),
848-
retirement_status: None,
849-
outer_checksum: vec![
850-
111, 246, 240, 176, 118, 229, 12, 15, 164, 61, 186, 3, 89, 106, 153, 225,
851-
247, 52, 245, 8, 216, 139, 21, 232, 200, 16, 214, 59, 241, 188, 9, 6
852-
],
853-
meta: (),
854-
},
855-
Release {
856-
version: Version::try_from("0.2.0").unwrap(),
857-
requirements: [].into(),
858-
retirement_status: None,
859-
outer_checksum: vec![
860-
149, 9, 192, 229, 84, 162, 110, 207, 161, 43, 31, 0, 126, 168, 14, 243, 31,
861-
43, 195, 238, 100, 91, 78, 100, 213, 181, 101, 154, 106, 168, 170, 107
862-
],
863-
meta: (),
864-
},
865-
Release {
866-
version: Version::try_from("0.2.1").unwrap(),
867-
requirements: [].into(),
868-
retirement_status: None,
869-
outer_checksum: vec![
870-
157, 229, 28, 212, 92, 249, 14, 240, 235, 104, 31, 12, 160, 199, 83, 195,
871-
154, 105, 222, 37, 221, 80, 181, 183, 113, 240, 234, 107, 144, 85, 255, 65
872-
],
873-
meta: (),
874-
},
875-
Release {
876-
version: Version::try_from("0.2.2").unwrap(),
877-
requirements: [].into(),
878-
retirement_status: None,
879-
outer_checksum: vec![
880-
112, 250, 133, 189, 183, 192, 54, 218, 115, 55, 216, 97, 204, 201, 191,
881-
168, 250, 133, 138, 252, 202, 240, 74, 197, 228, 235, 81, 18, 241, 7, 155,
882-
38
883-
],
884-
meta: (),
885-
},
886-
Release {
887-
version: Version::try_from("0.2.3").unwrap(),
888-
requirements: [].into(),
889-
retirement_status: None,
890-
outer_checksum: vec![
891-
131, 20, 29, 160, 171, 124, 7, 125, 210, 88, 17, 189, 199, 49, 191, 190,
892-
14, 162, 38, 247, 52, 176, 189, 17, 7, 188, 151, 152, 24, 64, 170, 29
893-
],
894-
meta: (),
895-
},
896-
Release {
897-
version: Version::try_from("0.2.4").unwrap(),
898-
requirements: [].into(),
899-
retirement_status: None,
900-
outer_checksum: vec![
901-
109, 162, 185, 169, 26, 4, 62, 60, 167, 54, 182, 161, 140, 197, 75, 113,
902-
183, 117, 247, 201, 218, 228, 14, 160, 115, 157, 196, 51, 108, 16, 96, 217
903-
],
904-
meta: (),
905-
},
906-
Release {
907-
version: Version::try_from("0.3.0").unwrap(),
908-
requirements: [].into(),
909-
retirement_status: None,
910-
outer_checksum: vec![
911-
97, 50, 95, 212, 242, 59, 245, 177, 140, 78, 79, 180, 108, 174, 119, 176,
912-
24, 80, 218, 152, 178, 227, 152, 242, 32, 126, 72, 67, 222, 0, 173, 170
913-
],
914-
meta: (),
915-
},
916-
Release {
917-
version: Version::try_from("0.4.0").unwrap(),
918-
requirements: [].into(),
919-
retirement_status: None,
920-
outer_checksum: vec![
921-
246, 178, 237, 214, 217, 158, 143, 52, 130, 186, 64, 50, 94, 175, 161, 81,
922-
68, 186, 4, 73, 53, 226, 235, 144, 209, 84, 231, 136, 165, 119, 122, 126
923-
],
924-
meta: (),
925-
},
926-
Release {
927-
version: Version::try_from("0.5.0").unwrap(),
928-
requirements: [].into(),
929-
retirement_status: None,
930-
outer_checksum: vec![
931-
151, 86, 157, 218, 218, 131, 240, 119, 198, 216, 202, 240, 65, 17, 57, 228,
932-
84, 252, 59, 207, 246, 49, 22, 21, 52, 47, 51, 139, 190, 9, 95, 109
933-
],
934-
meta: (),
935-
}
936-
],
937-
},
941+
expected_package_exfmt(),
938942
package,
939943
);
940944

@@ -959,6 +963,38 @@ async fn get_package_not_found() {
959963
assert!(error.is_not_found());
960964
}
961965

966+
#[tokio::test]
967+
async fn get_package_from_bytes_ok() {
968+
let response_body = std::include_bytes!("../test/package_exfmt");
969+
let mut uncompressed = Vec::new();
970+
let mut decoder = GzDecoder::new(Cursor::new(response_body));
971+
let _ = decoder.read_to_end(&mut uncompressed).expect("failed to decompress body");
972+
973+
let package = crate::get_package_data(
974+
&uncompressed,
975+
std::include_bytes!("../test/public_key")
976+
)
977+
.expect("package failed to parse");
978+
979+
assert_eq!(
980+
expected_package_exfmt(),
981+
package,
982+
);
983+
}
984+
985+
#[tokio::test]
986+
async fn get_package_from_bytes_malformed() {
987+
// public key should not be a valid protobuf and should therefore fail
988+
let bytes = std::include_bytes!("../test/public_key").to_vec();
989+
let package_error = crate::get_package_data(
990+
&bytes,
991+
&bytes,
992+
)
993+
.expect_err("parsing failed to fail");
994+
995+
assert!(package_error.is_invalid_protobuf());
996+
}
997+
962998
#[tokio::test]
963999
async fn get_repository_versions_ok_test() {
9641000
let response_body = std::include_bytes!("../test/versions");
@@ -1003,6 +1039,49 @@ async fn get_repository_versions_ok_test() {
10031039
mock.assert();
10041040
}
10051041

1042+
#[tokio::test]
1043+
async fn get_repository_versions_from_bytes_ok() {
1044+
let response_body = std::include_bytes!("../test/versions");
1045+
let mut uncompressed = Vec::new();
1046+
let mut decoder = GzDecoder::new(Cursor::new(response_body));
1047+
let _ = decoder.read_to_end(&mut uncompressed).expect("failed to decompress body");
1048+
1049+
let versions = crate::get_repository_versions_data(
1050+
&uncompressed,
1051+
std::include_bytes!("../test/public_key"),
1052+
)
1053+
.expect("versions failed to parse");
1054+
1055+
assert_eq!(
1056+
&vec![
1057+
Version::parse("0.0.0").unwrap(),
1058+
Version::parse("0.1.0").unwrap(),
1059+
Version::parse("0.2.0").unwrap(),
1060+
Version::parse("0.2.1").unwrap(),
1061+
Version::parse("0.2.2").unwrap(),
1062+
Version::parse("0.2.3").unwrap(),
1063+
Version::parse("0.2.4").unwrap(),
1064+
Version::parse("0.3.0").unwrap(),
1065+
Version::parse("0.4.0").unwrap(),
1066+
Version::parse("0.5.0").unwrap(),
1067+
],
1068+
versions.get("exfmt").unwrap(),
1069+
);
1070+
}
1071+
1072+
#[tokio::test]
1073+
async fn get_repository_versions_from_bytes_malformed() {
1074+
// public key should not be a valid protobuf and should therefore fail
1075+
let bytes = std::include_bytes!("../test/public_key").to_vec();
1076+
let versions_error = crate::get_repository_versions_data(
1077+
&bytes,
1078+
&bytes,
1079+
)
1080+
.expect_err("parsing failed to fail");
1081+
1082+
assert!(versions_error.is_invalid_protobuf());
1083+
}
1084+
10061085
#[tokio::test]
10071086
async fn get_repository_tarball_ok_test() {
10081087
let config = Config::new();

0 commit comments

Comments
 (0)