defmodule GitGud.LfsTest do
use GitGud.DataCase, async: false
alias GitGud.Lfs
alias GitGud.Lfs.LfsObject
alias GitGud.Storage
import GitGud.ForgeFixtures
setup do
{_user, repo} = repository_fixture()
{:ok, repo: repo}
end
@oid String.duplicate("a", 64)
@oid2 String.duplicate("b", 64)
test "batch upload returns upload + verify actions for new oids", %{repo: repo} do
resp = Lfs.batch(repo, "upload", [%{"oid" => @oid, "size" => 12}])
assert resp["transfer"] == "basic"
[obj] = resp["objects"]
assert obj["oid"] == @oid
assert obj["actions"]["upload"]["href"] =~ "/_storage/" or obj["actions"]["upload"]["href"] =~ "/"
assert obj["actions"]["verify"]["href"] =~ ~r"/info/lfs/verify$"
# Placeholder row was created, but not yet uploaded.
row = Lfs.get(repo, @oid)
assert row.size == 12
refute LfsObject.uploaded?(row)
end
test "batch upload for an already-uploaded oid skips the upload action", %{repo: repo} do
[%{"oid" => @oid, "size" => 12}] |> then(&Lfs.batch(repo, "upload", &1))
{:ok, _} = Lfs.verify(repo, @oid, 12)
resp = Lfs.batch(repo, "upload", [%{"oid" => @oid, "size" => 12}])
[obj] = resp["objects"]
refute Map.has_key?(obj, "actions")
end
test "batch download yields 404-per-object for missing oids", %{repo: repo} do
resp = Lfs.batch(repo, "download", [%{"oid" => @oid2, "size" => 5}])
[obj] = resp["objects"]
assert obj["error"]["code"] == 404
end
test "batch download returns a download action for an uploaded oid", %{repo: repo} do
Lfs.batch(repo, "upload", [%{"oid" => @oid, "size" => 5}])
# Simulate the actual blob being written.
row = Lfs.get(repo, @oid)
:ok = Storage.put(row.storage_bucket, row.storage_key, "hello", [])
{:ok, _} = Lfs.verify(repo, @oid, 5)
resp = Lfs.batch(repo, "download", [%{"oid" => @oid, "size" => 5}])
[obj] = resp["objects"]
refute Map.has_key?(obj, "error")
assert is_binary(obj["actions"]["download"]["href"])
end
test "verify rejects size mismatch", %{repo: repo} do
Lfs.batch(repo, "upload", [%{"oid" => @oid, "size" => 5}])
assert {:error, :size_mismatch} = Lfs.verify(repo, @oid, 99)
end
test "verify rejects unknown oid", %{repo: repo} do
assert {:error, :unknown_oid} = Lfs.verify(repo, @oid2, 5)
end
end
2.3 KiB · text
5af55d9