1defmodule Hex.RepoTest do 2 use HexTest.IntegrationCase 3 4 @private_key File.read!(Path.join(__DIR__, "../fixtures/test_priv.pem")) 5 6 test "get_package" do 7 assert {:ok, {200, _, _}} = Hex.Repo.get_package("hexpm", "postgrex", "") 8 9 assert_raise Mix.Error, ~r"Unknown repository \"bad\"", fn -> 10 Hex.Repo.get_package("bad", "postgrex", "") 11 end 12 end 13 14 test "verify signature" do 15 message = :mix_hex_registry.sign_protobuf("payload", @private_key) 16 assert Hex.Repo.verify(message, "hexpm") == "payload" 17 18 assert_raise(Mix.Error, fn -> 19 message = :mix_hex_pb_signed.encode_msg(%{payload: "payload", signature: "foobar"}, :Signed) 20 Hex.Repo.verify(message, "hexpm") 21 end) 22 end 23 24 test "decode package" do 25 package = %{releases: [], repository: "hexpm", name: "ecto"} 26 message = :mix_hex_pb_package.encode_msg(package, :Package) 27 28 assert Hex.Repo.decode_package(message, "hexpm", "ecto") == [] 29 end 30 31 test "decode package verify origin" do 32 package = %{releases: [], repository: "hexpm", name: "ecto"} 33 message = :mix_hex_pb_package.encode_msg(package, :Package) 34 35 assert_raise(Mix.Error, fn -> 36 Hex.Repo.decode_package(message, "other repo", "ecto") 37 end) 38 39 assert_raise(Mix.Error, fn -> 40 Hex.Repo.decode_package(message, "hexpm", "other package") 41 end) 42 43 Hex.State.put(:no_verify_repo_origin, true) 44 assert Hex.Repo.decode_package(message, "other repo", "ecto") == [] 45 assert Hex.Repo.decode_package(message, "hexpm", "other package") == [] 46 end 47 48 test "get public key" do 49 bypass = Bypass.open() 50 repos = Hex.State.fetch!(:repos) 51 hexpm = Hex.Repo.default_hexpm_repo() 52 repos = put_in(repos["hexpm"].url, "http://localhost:#{bypass.port}") 53 Hex.State.put(:repos, repos) 54 55 Bypass.expect(bypass, fn %Plug.Conn{request_path: path} = conn -> 56 case path do 57 "/public_key" -> 58 Plug.Conn.resp(conn, 200, hexpm.public_key) 59 60 "/not_found/public_key" -> 61 Plug.Conn.resp(conn, 404, "not found") 62 end 63 end) 64 65 assert {:ok, {200, public_key, _}} = 66 Hex.Repo.get_public_key("http://localhost:#{bypass.port}", nil) 67 68 assert public_key == hexpm.public_key 69 70 assert {:ok, {404, "not found", _}} = 71 Hex.Repo.get_public_key("http://localhost:#{bypass.port}/not_found", nil) 72 end 73end 74