package spindle

import (
	"testing"

	"tangled.org/core/api/org_tangled"
	"tangled.org/core/spindle/config"
	"tangled.org/core/tapc"
)

func TestManifestFromAnUnadmittedOwnerCostsNoReads(t *testing.T) {
	declared := &org_tangled.RepoManifest_Declaration{Owner: testOwner.String(), Name: "repo"}
	for name, manifest := range map[string]org_tangled.RepoManifest{
		"naming an unadmitted owner": {Declaration: declared},
		"without a declaration":      {},
	} {
		t.Run(name, func(t *testing.T) {
			env := newEnsureEnv(t)
			env.s.cfg.Server.Admission = config.AdmissionClosed
			env.serve("repo")

			manifest.Spindle = ptr(env.spindleDid())
			evt := recordEvent(testRepoDid, org_tangled.RepoManifestNSID, "self", tapc.RecordCreateAction, manifest)
			processOK(t, env, evt)
			if got := env.knot.count(); got != 0 {
				t.Fatalf("a manifest %s cost %d knot and pds requests", name, got)
			}
			if rows := env.rows(t); len(rows) != 0 {
				t.Fatalf("rows = %+v", rows)
			}
			if attempts, err := env.s.db.RepoRetryAttempts(testRepoDid); err != nil || attempts != 0 {
				t.Fatalf("retry attempts = %d, %v", attempts, err)
			}
		})
	}
}

func TestManifestFromAnAdmittedOwnerIsServed(t *testing.T) {
	env := newEnsureEnv(t)
	env.s.cfg.Server.Admission = config.AdmissionClosed
	env.s.cfg.Server.Admins = []string{testOwner.String()}
	env.serve("repo")

	processOK(t, env, markEvent(testRepoDid, env.spindleDid(), testOwner))
	if rows := env.rows(t); len(rows) != 1 {
		t.Fatalf("an admin's manifest wasn't served, rows = %+v", rows)
	}
}
