Skip to content
quarry Artifact [caf55971f2]
Login

Artifact [caf55971f2]

Artifact caf55971f2579006a88161d39d6ab225bb838f6a7915500487f297a334cfde34:


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