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
66use super :: * ;
77use 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]
805915async 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]
963999async 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]
10071086async fn get_repository_tarball_ok_test ( ) {
10081087 let config = Config :: new ( ) ;
0 commit comments