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