97f81af03f521ebc51c64ec84a8649e28d7fa8a0 / internal/db/releases_test.go · 3895 bytes · raw
package db
import (
"errors"
"testing"
)
func TestCreateReleaseAndLookup(t *testing.T) {
database := openTestDB(t)
ownerID, _ := CreateUser(database, "josie", "hash")
repo, _ := CreateRepo(database, ownerID, "alpha", "", "public")
other, _ := CreateRepo(database, ownerID, "beta", "", "public")
first, err := CreateRelease(database, repo.ID, "v1.0.0", "One", "notes **one**", ownerID)
if err != nil {
t.Fatalf("CreateRelease: %v", err)
}
if first.Tag != "v1.0.0" || first.Title != "One" || !first.AuthorID.Valid || first.AuthorID.Int64 != ownerID {
t.Errorf("release = %+v, want tag/title/author set", first)
}
second, err := CreateRelease(database, repo.ID, "v1.0.1", "Two", "notes two", ownerID)
if err != nil {
t.Fatalf("CreateRelease second: %v", err)
}
if got, err := GetReleaseByID(database, first.ID); err != nil || got.Tag != "v1.0.0" {
t.Errorf("GetReleaseByID = (%+v, %v), want v1.0.0", got, err)
}
if got, err := GetReleaseByTag(database, repo.ID, "v1.0.0"); err != nil || got.ID != first.ID {
t.Errorf("GetReleaseByTag = (%+v, %v), want id %d", got, err, first.ID)
}
if _, err := GetReleaseByTag(database, other.ID, "v1.0.0"); !errors.Is(err, ErrNotFound) {
t.Errorf("cross-repo GetReleaseByTag err = %v, want ErrNotFound", err)
}
list, err := ListReleases(database, repo.ID)
if err != nil {
t.Fatalf("ListReleases: %v", err)
}
if len(list) != 2 || list[0].ID != second.ID {
t.Errorf("ListReleases = %+v, want newest (v1.0.1) first", list)
}
if _, err := CreateRelease(database, repo.ID, "v1.0.0", "dupe", "", ownerID); !errors.Is(err, ErrReleaseExists) {
t.Errorf("duplicate CreateRelease err = %v, want ErrReleaseExists", err)
}
}
func TestDeleteReleaseScoped(t *testing.T) {
database := openTestDB(t)
ownerID, _ := CreateUser(database, "josie", "hash")
repo, _ := CreateRepo(database, ownerID, "alpha", "", "public")
other, _ := CreateRepo(database, ownerID, "beta", "", "public")
release, _ := CreateRelease(database, repo.ID, "v1", "One", "", ownerID)
if err := DeleteRelease(database, other.ID, release.ID); !errors.Is(err, ErrNotFound) {
t.Errorf("cross-repo DeleteRelease err = %v, want ErrNotFound", err)
}
if err := DeleteRelease(database, repo.ID, release.ID); err != nil {
t.Fatalf("DeleteRelease: %v", err)
}
if _, err := GetReleaseByID(database, release.ID); !errors.Is(err, ErrNotFound) {
t.Errorf("release after delete err = %v, want ErrNotFound", err)
}
}
func TestReleaseAssets(t *testing.T) {
database := openTestDB(t)
ownerID, _ := CreateUser(database, "josie", "hash")
repo, _ := CreateRepo(database, ownerID, "alpha", "", "public")
other, _ := CreateRepo(database, ownerID, "beta", "", "public")
release, _ := CreateRelease(database, repo.ID, "v1", "One", "", ownerID)
asset, err := CreateReleaseAsset(database, release.ID, "simplegit-linux", "deadbeef", 12345)
if err != nil {
t.Fatalf("CreateReleaseAsset: %v", err)
}
if asset.Filename != "simplegit-linux" || asset.StoredName != "deadbeef" || asset.Size != 12345 {
t.Errorf("asset = %+v", asset)
}
assets, err := ListReleaseAssets(database, release.ID)
if err != nil || len(assets) != 1 {
t.Fatalf("ListReleaseAssets = (%+v, %v), want one", assets, err)
}
if got, err := GetReleaseAssetForRepo(database, repo.ID, asset.ID); err != nil || got.ID != asset.ID {
t.Errorf("GetReleaseAssetForRepo = (%+v, %v), want id %d", got, err, asset.ID)
}
if _, err := GetReleaseAssetForRepo(database, other.ID, asset.ID); !errors.Is(err, ErrNotFound) {
t.Errorf("cross-repo GetReleaseAssetForRepo err = %v, want ErrNotFound", err)
}
if err := DeleteReleaseAsset(database, release.ID, asset.ID); err != nil {
t.Fatalf("DeleteReleaseAsset: %v", err)
}
if _, err := GetReleaseAssetForRepo(database, repo.ID, asset.ID); !errors.Is(err, ErrNotFound) {
t.Errorf("asset after delete err = %v, want ErrNotFound", err)
}
}