Skip to content
edgesync Artifact [105bbed748]
Login

Artifact [105bbed748]

Artifact 105bbed748251dff26615dab55ad9b1aab0e4c0815855719a1bf82d6dea861d6:


package hub

import (
	"context"
	"testing"
	"time"

	libfossil "github.com/danmestas/go-libfossil"
)

func TestHub_FileToCommit_PermXMarksExecutable(t *testing.T) {
	h := newTestHub(t)
	ctx := context.Background()

	rev, err := h.Commit(ctx, CommitOpts{
		Files: []FileToCommit{
			{Name: "script.sh", Content: []byte("#!/bin/sh\necho hi\n"), Perm: "x"},
			{Name: "data.txt", Content: []byte("hi\n")},
		},
		Message: "perm round-trip",
		Author:  "hub",
	})
	if err != nil {
		t.Fatalf("Commit: %v", err)
	}

	r := h.Repo().handle
	rid, err := r.ResolveVersion(string(rev))
	if err != nil {
		t.Fatalf("ResolveVersion(%s): %v", rev, err)
	}

	entries, err := r.ListFiles(rid)
	if err != nil {
		t.Fatalf("ListFiles: %v", err)
	}

	got := map[string]string{}
	for _, e := range entries {
		got[e.Name] = e.Perm
	}
	if got["script.sh"] != "x" {
		t.Errorf("script.sh perm = %q, want %q", got["script.sh"], "x")
	}
	if got["data.txt"] != "" {
		t.Errorf("data.txt perm = %q, want empty (default)", got["data.txt"])
	}
}

func TestHub_CommitOpts_TimeIsHonoured(t *testing.T) {
	h := newTestHub(t)
	ctx := context.Background()

	want := time.Date(2024, 6, 15, 12, 30, 0, 0, time.UTC)

	rev, err := h.Commit(ctx, CommitOpts{
		Files:   []FileToCommit{{Name: "f.txt", Content: []byte("x")}},
		Message: "explicit time",
		Author:  "hub",
		Time:    want,
	})
	if err != nil {
		t.Fatalf("Commit: %v", err)
	}

	r := h.Repo().handle
	entries, err := r.Timeline(libfossil.TimelineOpts{Limit: 1})
	if err != nil {
		t.Fatalf("Timeline: %v", err)
	}
	if len(entries) == 0 {
		t.Fatal("Timeline returned no entries")
	}
	if entries[0].UUID != string(rev) {
		t.Fatalf("newest timeline entry = %s, want committed rev %s", entries[0].UUID, rev)
	}
	got := entries[0].Time.UTC()
	if !got.Equal(want) {
		t.Errorf("commit time = %s, want %s", got, want)
	}
}

func TestHub_CommitOpts_ZeroTimeDefaultsToNow(t *testing.T) {
	h := newTestHub(t)
	ctx := context.Background()

	before := time.Now().UTC().Add(-1 * time.Second)
	rev, err := h.Commit(ctx, CommitOpts{
		Files:   []FileToCommit{{Name: "f.txt", Content: []byte("x")}},
		Message: "default time",
		Author:  "hub",
	})
	if err != nil {
		t.Fatalf("Commit: %v", err)
	}
	after := time.Now().UTC().Add(1 * time.Second)

	r := h.Repo().handle
	entries, err := r.Timeline(libfossil.TimelineOpts{Limit: 1})
	if err != nil {
		t.Fatalf("Timeline: %v", err)
	}
	if len(entries) == 0 {
		t.Fatal("Timeline returned no entries")
	}
	if entries[0].UUID != string(rev) {
		t.Fatalf("newest timeline entry = %s, want committed rev %s", entries[0].UUID, rev)
	}
	got := entries[0].Time.UTC()
	if got.Before(before) || got.After(after) {
		t.Errorf("commit time = %s, want in [%s, %s]", got, before, after)
	}
}