josie / simplegit

package db

import (
	"errors"
	"testing"
)

func TestCreateAndGetRepo(t *testing.T) {
	database := openTestDB(t)
	ownerID, err := CreateUser(database, "josie", "hash")
	if err != nil {
		t.Fatalf("CreateUser: %v", err)
	}

	repo, err := CreateRepo(database, ownerID, "demo", "desc", "public")
	if err != nil {
		t.Fatalf("CreateRepo: %v", err)
	}
	if repo.ID == 0 || repo.OwnerID != ownerID {
		t.Errorf("repo IDs = %+v, want nonzero id and owner %d", repo, ownerID)
	}
	if repo.DefaultBranch != "main" || repo.Visibility != "public" {
		t.Errorf("repo = %+v, want column defaults main/public", repo)
	}
	if repo.PushedAt.Valid {
		t.Errorf("PushedAt = %d, want NULL", repo.PushedAt.Int64)
	}

	byID, err := GetRepoByID(database, repo.ID)
	if err != nil {
		t.Fatalf("GetRepoByID: %v", err)
	}
	if byID.Name != "demo" {
		t.Errorf("GetRepoByID name = %q, want demo", byID.Name)
	}
	byName, err := GetRepoByName(database, "josie", "demo")
	if err != nil {
		t.Fatalf("GetRepoByName: %v", err)
	}
	if byName.ID != repo.ID {
		t.Errorf("GetRepoByName id = %d, want %d", byName.ID, repo.ID)
	}
	if _, err := GetRepoByName(database, "josie", "nope"); !errors.Is(err, ErrNotFound) {
		t.Errorf("missing repo err = %v, want ErrNotFound", err)
	}
	if _, err := GetRepoByName(database, "nobody", "demo"); !errors.Is(err, ErrNotFound) {
		t.Errorf("missing owner err = %v, want ErrNotFound", err)
	}
	if _, err := CreateRepo(database, ownerID, "demo", "", "private"); err == nil {
		t.Error("duplicate (owner, name) accepted")
	}
}

func TestUpdateRepoVisibilityAndRename(t *testing.T) {
	database := openTestDB(t)
	ownerID, err := CreateUser(database, "josie", "hash")
	if err != nil {
		t.Fatalf("CreateUser: %v", err)
	}
	repo, err := CreateRepo(database, ownerID, "demo", "", "private")
	if err != nil {
		t.Fatalf("CreateRepo: %v", err)
	}

	if err := UpdateRepoVisibility(database, repo.ID, "public"); err != nil {
		t.Fatalf("UpdateRepoVisibility: %v", err)
	}
	got, err := GetRepoByID(database, repo.ID)
	if err != nil {
		t.Fatalf("GetRepoByID: %v", err)
	}
	if got.Visibility != "public" {
		t.Errorf("Visibility = %q, want public", got.Visibility)
	}

	if err := RenameRepo(database, repo.ID, "renamed"); err != nil {
		t.Fatalf("RenameRepo: %v", err)
	}
	if _, err := GetRepoByName(database, "josie", "renamed"); err != nil {
		t.Errorf("renamed repo not found: %v", err)
	}
	if _, err := GetRepoByName(database, "josie", "demo"); !errors.Is(err, ErrNotFound) {
		t.Errorf("old name still resolves: %v", err)
	}

	if err := UpdateRepoVisibility(database, repo.ID+99, "public"); !errors.Is(err, ErrNotFound) {
		t.Errorf("visibility on missing repo err = %v, want ErrNotFound", err)
	}
	if err := RenameRepo(database, repo.ID+99, "x"); !errors.Is(err, ErrNotFound) {
		t.Errorf("rename missing repo err = %v, want ErrNotFound", err)
	}
}

func TestRecordPush(t *testing.T) {
	database := openTestDB(t)
	ownerID, err := CreateUser(database, "josie", "hash")
	if err != nil {
		t.Fatalf("CreateUser: %v", err)
	}
	if _, err := CreateRepo(database, ownerID, "demo", "", "private"); err != nil {
		t.Fatalf("CreateRepo: %v", err)
	}

	if err := RecordPush(database, "josie", "demo", 12345, ""); err != nil {
		t.Fatalf("RecordPush touch: %v", err)
	}
	repo, err := GetRepoByName(database, "josie", "demo")
	if err != nil {
		t.Fatalf("GetRepoByName: %v", err)
	}
	if !repo.PushedAt.Valid || repo.PushedAt.Int64 != 12345 {
		t.Errorf("PushedAt = %+v, want 12345", repo.PushedAt)
	}
	if repo.DefaultBranch != "main" {
		t.Errorf("DefaultBranch = %q, want unchanged main", repo.DefaultBranch)
	}

	if err := RecordPush(database, "josie", "demo", 12346, "master"); err != nil {
		t.Fatalf("RecordPush default: %v", err)
	}
	repo, err = GetRepoByName(database, "josie", "demo")
	if err != nil {
		t.Fatalf("GetRepoByName: %v", err)
	}
	if repo.DefaultBranch != "master" || repo.PushedAt.Int64 != 12346 {
		t.Errorf("repo = %+v, want default master and pushed_at 12346", repo)
	}

	if err := RecordPush(database, "josie", "nope", 1, ""); !errors.Is(err, ErrNotFound) {
		t.Errorf("RecordPush missing repo err = %v, want ErrNotFound", err)
	}
}

func TestDeleteRepo(t *testing.T) {
	database := openTestDB(t)
	ownerID, err := CreateUser(database, "josie", "hash")
	if err != nil {
		t.Fatalf("CreateUser: %v", err)
	}
	repo, err := CreateRepo(database, ownerID, "demo", "", "private")
	if err != nil {
		t.Fatalf("CreateRepo: %v", err)
	}
	if err := DeleteRepo(database, repo.ID); err != nil {
		t.Fatalf("DeleteRepo: %v", err)
	}
	if _, err := GetRepoByID(database, repo.ID); !errors.Is(err, ErrNotFound) {
		t.Errorf("deleted repo err = %v, want ErrNotFound", err)
	}
}