From 1bafde09b64a02ca11f491b2dbd45ef6de5b4de7 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Wed, 21 Aug 2024 00:50:19 +0200 Subject: [PATCH 1/2] test: Implement db unit tests --- .github/workflows/go.yml | 17 +++++++++++++ db/contexts_test.go | 29 +++++++++++++++++++++ db/db_test.go | 55 ++++++++++++++++++++++++++++++++++++++++ db/patterns_test.go | 1 + db/sessions_test.go | 38 +++++++++++++++++++++++++++ db/storage_test.go | 52 +++++++++++++++++++++++++++++++++++++ 6 files changed, 192 insertions(+) create mode 100644 db/contexts_test.go create mode 100644 db/db_test.go create mode 100644 db/patterns_test.go create mode 100644 db/sessions_test.go create mode 100644 db/storage_test.go diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 6284d68..0e255c8 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -9,6 +9,23 @@ on: branches: ["main"] jobs: + test: + name: Run tests + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version-file: ./go.mod + + - name: Run tests + run: go test -v ./... + build: name: Build binaries for Windows, macOS, and Linux runs-on: ${{ matrix.os }} diff --git a/db/contexts_test.go b/db/contexts_test.go new file mode 100644 index 0000000..678d6f8 --- /dev/null +++ b/db/contexts_test.go @@ -0,0 +1,29 @@ +package db + +import ( + "os" + "path/filepath" + "testing" +) + +func TestContexts_GetContext(t *testing.T) { + dir := t.TempDir() + contexts := &Contexts{ + Storage: &Storage{Dir: dir}, + } + contextName := "testContext" + contextPath := filepath.Join(dir, contextName) + contextContent := "test content" + err := os.WriteFile(contextPath, []byte(contextContent), 0644) + if err != nil { + t.Fatalf("failed to write context file: %v", err) + } + context, err := contexts.GetContext(contextName) + if err != nil { + t.Fatalf("failed to get context: %v", err) + } + expectedContext := &Context{Name: contextName, Content: contextContent} + if *context != *expectedContext { + t.Errorf("expected %v, got %v", expectedContext, context) + } +} diff --git a/db/db_test.go b/db/db_test.go new file mode 100644 index 0000000..53135cf --- /dev/null +++ b/db/db_test.go @@ -0,0 +1,55 @@ +package db + +import ( + "os" + "testing" +) + +func TestDb_Configure(t *testing.T) { + dir := t.TempDir() + db := NewDb(dir) + err := db.Configure() + if err == nil { + t.Fatalf("db is configured, but must not be at empty dir: %v", dir) + } + if db.IsEnvFileExists() { + t.Fatalf("db file exists, but must not be at empty dir: %v", dir) + } + + err = db.SaveEnv("") + if err != nil { + t.Fatalf("db can't save env for empty conf.: %v", err) + } + + err = db.Configure() + if err != nil { + t.Fatalf("db is not configured, but shall be after save: %v", err) + } +} + +func TestDb_LoadEnvFile(t *testing.T) { + dir := t.TempDir() + db := NewDb(dir) + content := "KEY=VALUE\n" + err := os.WriteFile(db.EnvFilePath, []byte(content), 0644) + if err != nil { + t.Fatalf("failed to write .env file: %v", err) + } + err = db.LoadEnvFile() + if err != nil { + t.Errorf("failed to load .env file: %v", err) + } +} + +func TestDb_SaveEnv(t *testing.T) { + dir := t.TempDir() + db := NewDb(dir) + content := "KEY=VALUE\n" + err := db.SaveEnv(content) + if err != nil { + t.Errorf("failed to save .env file: %v", err) + } + if _, err := os.Stat(db.EnvFilePath); os.IsNotExist(err) { + t.Errorf("expected .env file to be saved") + } +} diff --git a/db/patterns_test.go b/db/patterns_test.go new file mode 100644 index 0000000..3a49c63 --- /dev/null +++ b/db/patterns_test.go @@ -0,0 +1 @@ +package db diff --git a/db/sessions_test.go b/db/sessions_test.go new file mode 100644 index 0000000..c420a4a --- /dev/null +++ b/db/sessions_test.go @@ -0,0 +1,38 @@ +package db + +import ( + "testing" + + "github.com/danielmiessler/fabric/common" +) + +func TestSessions_GetOrCreateSession(t *testing.T) { + dir := t.TempDir() + sessions := &Sessions{ + Storage: &Storage{Dir: dir, FileExtension: ".json"}, + } + sessionName := "testSession" + session, err := sessions.GetOrCreateSession(sessionName) + if err != nil { + t.Fatalf("failed to get or create session: %v", err) + } + if session.Name != sessionName { + t.Errorf("expected session name %v, got %v", sessionName, session.Name) + } +} + +func TestSessions_SaveSession(t *testing.T) { + dir := t.TempDir() + sessions := &Sessions{ + Storage: &Storage{Dir: dir, FileExtension: ".json"}, + } + sessionName := "testSession" + session := &Session{Name: sessionName, Messages: []*common.Message{{Content: "message1"}}} + err := sessions.SaveSession(session) + if err != nil { + t.Fatalf("failed to save session: %v", err) + } + if !sessions.Exists(sessionName) { + t.Errorf("expected session to be saved") + } +} diff --git a/db/storage_test.go b/db/storage_test.go new file mode 100644 index 0000000..529c441 --- /dev/null +++ b/db/storage_test.go @@ -0,0 +1,52 @@ +package db + +import ( + "testing" +) + +func TestStorage_SaveAndLoad(t *testing.T) { + dir := t.TempDir() + storage := &Storage{Dir: dir} + name := "test" + content := []byte("test content") + if err := storage.Save(name, content); err != nil { + t.Fatalf("failed to save content: %v", err) + } + loadedContent, err := storage.Load(name) + if err != nil { + t.Fatalf("failed to load content: %v", err) + } + if string(loadedContent) != string(content) { + t.Errorf("expected %v, got %v", string(content), string(loadedContent)) + } +} + +func TestStorage_Exists(t *testing.T) { + dir := t.TempDir() + storage := &Storage{Dir: dir} + name := "test" + if storage.Exists(name) { + t.Errorf("expected file to not exist") + } + if err := storage.Save(name, []byte("test content")); err != nil { + t.Fatalf("failed to save content: %v", err) + } + if !storage.Exists(name) { + t.Errorf("expected file to exist") + } +} + +func TestStorage_Delete(t *testing.T) { + dir := t.TempDir() + storage := &Storage{Dir: dir} + name := "test" + if err := storage.Save(name, []byte("test content")); err != nil { + t.Fatalf("failed to save content: %v", err) + } + if err := storage.Delete(name); err != nil { + t.Fatalf("failed to delete content: %v", err) + } + if storage.Exists(name) { + t.Errorf("expected file to be deleted") + } +} From ff97b8549753369d7cfa766a577ccebfe487fce5 Mon Sep 17 00:00:00 2001 From: Eugen Eisler Date: Wed, 21 Aug 2024 01:00:42 +0200 Subject: [PATCH 2/2] ci: split ci and release jobs --- .github/workflows/ci.yml | 25 +++++++++++++++++++++++ .github/workflows/{go.yml => release.yml} | 2 -- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci.yml rename .github/workflows/{go.yml => release.yml} (98%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..74280d4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: Go Build and Release + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + test: + name: Run tests + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version-file: ./go.mod + + - name: Run tests + run: go test -v ./... diff --git a/.github/workflows/go.yml b/.github/workflows/release.yml similarity index 98% rename from .github/workflows/go.yml rename to .github/workflows/release.yml index 0e255c8..3726e58 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/release.yml @@ -5,8 +5,6 @@ on: branches: ["main"] tags: - "v*" - pull_request: - branches: ["main"] jobs: test: