Skip to content
quarry Artifact [2ff281201c]
Login

Artifact [2ff281201c]

Artifact 2ff281201c88c6510e0a994d590a75cf043d9f417954edceb28655a9ba135259:


package oltp

import (
	"path/filepath"
	"testing"
)

// The waiting list keeps first-wait order, answers by check-in, forgets
// on undefer, and the running count sees only unfinished runs.
func TestDeferredCheckinsRoundTrip(t *testing.T) {
	db, err := Open(filepath.Join(t.TempDir(), "oltp.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	if err := db.DeferCI(CIDeferred{Repo: "r", Checkin: "c1", Branch: "feat/a", User: "ada"}); err != nil {
		t.Fatal(err)
	}
	if err := db.DeferCI(CIDeferred{Repo: "r", Checkin: "c2", Branch: "feat/b"}); err != nil {
		t.Fatal(err)
	}
	if err := db.DeferCI(CIDeferred{Repo: "r", Checkin: "c1", Branch: "feat/a"}); err != nil {
		t.Fatal(err) // twice keeps the first wait
	}
	if err := db.DeferCI(CIDeferred{Checkin: "x"}); err == nil {
		t.Error("a row without a repository was accepted")
	}
	rows, err := db.CIDeferred("r")
	if err != nil || len(rows) != 2 || rows[0].Checkin != "c1" || rows[1].Checkin != "c2" || rows[0].Since == "" {
		t.Fatalf("waiting = %+v, %v", rows, err)
	}
	if w, ok, _ := db.CIDeferredFor("r", "c2"); !ok || w.Branch != "feat/b" {
		t.Errorf("by check-in = %+v %v", w, ok)
	}
	if _, ok, _ := db.CIDeferredFor("r", "nope"); ok {
		t.Error("an unknown check-in reads as waiting")
	}
	if err := db.UndeferCI("r", "c1"); err != nil {
		t.Fatal(err)
	}
	if rows, _ = db.CIDeferred("r"); len(rows) != 1 || rows[0].Checkin != "c2" {
		t.Errorf("after undefer = %+v", rows)
	}
}

func TestCIDeferredReposListsEachRepositoryOnce(t *testing.T) {
	db, err := Open(filepath.Join(t.TempDir(), "oltp.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	for _, c := range []CIDeferred{{Repo: "b", Checkin: "1"}, {Repo: "a", Checkin: "2"}, {Repo: "b", Checkin: "3"}} {
		if err := db.DeferCI(c); err != nil {
			t.Fatal(err)
		}
	}
	got, err := db.CIDeferredRepos()
	if err != nil || len(got) != 2 || got[0] != "a" || got[1] != "b" {
		t.Fatalf("FAIL: repos = %v, %v; want [a b]", got, err)
	}
}