Skip to content
quarry Artifact [635c1fb943]
Login

Artifact [635c1fb943]

Artifact 635c1fb943339c6fab66bf5368068f7f7f1d8ab4dce156e6523c6db9cefce4c0:


package oltp

import (
	"path/filepath"
	"testing"
)

func TestLocalTicketLifecycle(t *testing.T) {
	db, err := Open(filepath.Join(t.TempDir(), "o.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	id, err := db.LocalTicketNew("alpha", "visitor", "10.0.0.9",
		map[string]string{"title": "crash on empty input", "status": "Open", "type": "Code_Defect"})
	if err != nil || len(id) != 40 {
		t.Fatalf("new = %q, %v", id, err)
	}
	// A change folds over the first write; the comment stays out of the
	// folded fields and lands in the discussion.
	if err := db.LocalTicketSet("alpha", id, "dan",
		map[string]string{"status": "Verified", "icomment": "reproduced on trunk", "mimetype": "text/x-markdown"}); err != nil {
		t.Fatal(err)
	}
	tk, ok, err := db.LocalTicketByPrefix("alpha", id[:12])
	if err != nil || !ok {
		t.Fatalf("byPrefix: %v, %v", ok, err)
	}
	if tk.Fields["status"] != "Verified" || tk.Fields["title"] != "crash on empty input" {
		t.Fatalf("fold = %v", tk.Fields)
	}
	if tk.Fields["icomment"] != "" {
		t.Fatal("a per-change field leaked into the fold")
	}
	if len(tk.Comments) != 1 || tk.Comments[0].Body != "reproduced on trunk" || tk.Comments[0].Login != "dan" {
		t.Fatalf("comments = %v", tk.Comments)
	}
	if tk.Author != "visitor" || len(tk.Changes) != 2 {
		t.Fatalf("author %q, %d changes", tk.Author, len(tk.Changes))
	}
	if ts, err := db.LocalTickets("alpha"); err != nil || len(ts) != 1 {
		t.Fatalf("list = %d, %v", len(ts), err)
	}
	if ts, err := db.LocalTickets("beta"); err != nil || len(ts) != 0 {
		t.Fatalf("another repo saw the ticket: %d, %v", len(ts), err)
	}
}

func TestLocalTicketPromotionTombstones(t *testing.T) {
	db, err := Open(filepath.Join(t.TempDir(), "o.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	id, err := db.LocalTicketNew("alpha", "eve", "", map[string]string{"title": "worthy"})
	if err != nil {
		t.Fatal(err)
	}
	claim, _, err := db.LocalTicketClaim("alpha", id)
	if err != nil {
		t.Fatal(err)
	}
	if err := db.LocalTicketPromoted("alpha", id, "f0551171", claim); err != nil {
		t.Fatal(err)
	}
	if ts, _ := db.LocalTickets("alpha"); len(ts) != 0 {
		t.Fatal("a promoted ticket still lists as local")
	}
	if to, ok := db.LocalTicketRedirect("alpha", id[:12]); !ok || to != "f0551171" {
		t.Fatalf("redirect = %q, %v", to, ok)
	}
	// The tombstone refuses further changes.
	if err := db.LocalTicketSet("alpha", id, "eve", map[string]string{"status": "Open"}); err == nil {
		t.Fatal("a promoted ticket accepted a change")
	}
}

func TestLocalTicketDiscardAndRateCount(t *testing.T) {
	db, err := Open(filepath.Join(t.TempDir(), "o.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	id, err := db.LocalTicketNew("alpha", "spammer", "10.0.0.9", map[string]string{"title": "buy things"})
	if err != nil {
		t.Fatal(err)
	}
	if _, err := db.LocalTicketNew("alpha", "spammer", "10.0.0.9", map[string]string{"title": "more things"}); err != nil {
		t.Fatal(err)
	}
	if n, _ := db.LocalIntakeCount("alpha", "10.0.0.9", "2000-01-01T00:00:00"); n != 2 {
		t.Fatalf("intake count = %d", n)
	}
	if n, _ := db.LocalIntakeCount("alpha", "10.9.9.9", "2000-01-01T00:00:00"); n != 0 {
		t.Fatalf("another address counted = %d", n)
	}
	if err := db.LocalTicketDiscard("alpha", id); err != nil {
		t.Fatal(err)
	}
	if _, ok, _ := db.LocalTicketByPrefix("alpha", id[:12]); ok {
		t.Fatal("a discarded ticket answered")
	}
	if _, ok := db.LocalTicketRedirect("alpha", id[:12]); ok {
		t.Fatal("a discarded ticket redirected")
	}
}