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) } }