package oltp
import (
"testing"
"time"
)
func TestAnOfferGrantsNothingUntilItIsAccepted(t *testing.T) {
d := testDB(t)
if err := d.AddTeam("core", "Core", "", "owen"); err != nil {
t.Fatal(err)
}
if err := d.OfferTeamRepo("core", "quarry", "dan"); err != nil {
t.Fatal(err)
}
// The repository is where it was: an offer is not a team_repo row.
if team := d.TeamOfRepo("quarry"); team != "" {
t.Errorf("FAIL: offering moved the repository to %q", team)
}
got, ok, err := d.TeamOfferFor("quarry")
if err != nil || !ok {
t.Fatalf("FAIL: no pending offer (ok=%v err=%v)", ok, err)
}
if got.Team != "core" || got.OfferedBy != "dan" {
t.Errorf("FAIL: offer = %+v", got)
}
}
// A repository answers one team at a time, so offering it elsewhere
// replaces the pending question rather than adding a second.
func TestOfferingElsewhereReplacesThePendingOffer(t *testing.T) {
d := testDB(t)
for _, n := range []string{"core", "other"} {
if err := d.AddTeam(n, n, "", "owen"); err != nil {
t.Fatal(err)
}
}
if err := d.OfferTeamRepo("core", "quarry", "dan"); err != nil {
t.Fatal(err)
}
if err := d.OfferTeamRepo("other", "quarry", "dan"); err != nil {
t.Fatal(err)
}
if offers, err := d.TeamOffers("core"); err != nil || len(offers) != 0 {
t.Errorf("FAIL: core still has %d offer(s) (err=%v)", len(offers), err)
}
if offers, err := d.TeamOffers("other"); err != nil || len(offers) != 1 {
t.Fatalf("FAIL: other has %d offer(s) (err=%v)", len(offers), err)
}
}
// An expired offer is not pending, and cannot be accepted — reported
// absent before it is swept, so the answer does not depend on whether
// a listing happened to run first.
func TestAnExpiredOfferIsNotPending(t *testing.T) {
d := testDB(t)
if err := d.AddTeam("core", "Core", "", "owen"); err != nil {
t.Fatal(err)
}
if err := d.OfferTeamRepo("core", "quarry", "dan"); err != nil {
t.Fatal(err)
}
stale := time.Now().UTC().Add(-time.Minute).Format(time.RFC3339)
if _, err := d.db.Exec(`UPDATE team_repo_offer SET expires = ? WHERE repo = ?`,
stale, "quarry"); err != nil {
t.Fatal(err)
}
if _, ok, err := d.TeamOfferFor("quarry"); err != nil || ok {
t.Errorf("FAIL: an expired offer is still pending (ok=%v err=%v)", ok, err)
}
offers, err := d.TeamOffers("core")
if err != nil {
t.Fatal(err)
}
if len(offers) != 0 {
t.Errorf("FAIL: an expired offer is still listed: %+v", offers)
}
// The sweep actually removed it rather than the listing hiding it.
var n int
if err := d.db.QueryRow(`SELECT count(*) FROM team_repo_offer`).Scan(&n); err != nil {
t.Fatal(err)
}
if n != 0 {
t.Errorf("FAIL: %d expired row(s) left behind", n)
}
}