summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-06-04 10:08:04 +0300
committerPaul Buetow <paul@buetow.org>2024-06-04 10:08:04 +0300
commit08d07b0d9d5db780f41ab783f86389f329484948 (patch)
tree370b67e7f016939f55ae93dca6f379613aeea2bc /internal/server
parent11788abad75c0d4920ed4f7797febd7d36569a66 (diff)
more on unit testing and some refactoring
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/handler/handler.go2
-rw-r--r--internal/server/repository/repository.go34
-rw-r--r--internal/server/repository/repository_test.go64
3 files changed, 88 insertions, 12 deletions
diff --git a/internal/server/handler/handler.go b/internal/server/handler/handler.go
index 6549c9f..12c6660 100644
--- a/internal/server/handler/handler.go
+++ b/internal/server/handler/handler.go
@@ -62,7 +62,7 @@ func (h Handler) Get(w http.ResponseWriter, r *http.Request) error {
return fmt.Errorf("invalid id %s", id)
}
- data, err := repository.Instance(h.conf.DataDir).Get(id)
+ data, err := repository.Instance(h.conf.DataDir).GetBytes(id)
if err != err {
return err
}
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go
index b98ccfa..8e84f4b 100644
--- a/internal/server/repository/repository.go
+++ b/internal/server/repository/repository.go
@@ -11,7 +11,7 @@ import (
)
var (
- instance *Repository
+ instance Repository
once sync.Once
)
@@ -33,19 +33,23 @@ type Repository struct {
fs fs
}
-func Instance(dataDir string) *Repository {
+func Instance(dataDir string) Repository {
once.Do(func() {
- instance = &Repository{
- dataDir: dataDir,
- entries: make(map[string]types.Entry),
- mu: &sync.Mutex{},
- fs: vfs.RealFS{},
- }
+ instance = newRepository(dataDir, vfs.RealFS{})
})
return instance
}
-func (r Repository) add(entry types.Entry) {
+func newRepository(dataDir string, fs fs) Repository {
+ return Repository{
+ dataDir: dataDir,
+ entries: make(map[string]types.Entry),
+ mu: &sync.Mutex{},
+ fs: fs,
+ }
+}
+
+func (r Repository) put(entry types.Entry) {
r.mu.Lock()
defer r.mu.Unlock()
r.entries[entry.ID] = entry
@@ -63,7 +67,7 @@ func (r Repository) load() error {
if err != err {
return err
}
- r.add(entry)
+ r.put(entry)
}
return nil
@@ -85,10 +89,18 @@ func (r Repository) List() ([]byte, error) {
return json.Marshal(pairs)
}
-func (r Repository) Get(id string) ([]byte, error) {
+func (r Repository) GetBytes(id string) ([]byte, error) {
return r.fs.ReadFile(fmt.Sprintf("%s/%s", r.dataDir, id))
}
+func (r Repository) Get(id string) (types.Entry, error) {
+ bytes, err := r.GetBytes(id)
+ if err != nil {
+ return types.Entry{}, err
+ }
+ return types.NewEntry(bytes)
+}
+
func (r Repository) HasSameEntry(pair EntryPair) bool {
r.mu.Lock()
defer r.mu.Unlock()
diff --git a/internal/server/repository/repository_test.go b/internal/server/repository/repository_test.go
new file mode 100644
index 0000000..176808d
--- /dev/null
+++ b/internal/server/repository/repository_test.go
@@ -0,0 +1,64 @@
+package repository
+
+import (
+ "testing"
+
+ "codeberg.org/snonux/gos/internal/types"
+ "codeberg.org/snonux/gos/internal/vfs"
+)
+
+func TestRepositoryGet(t *testing.T) {
+ t.Parallel()
+
+ entry, _, err := twoDifferentEntries()
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ repo.put(entry)
+ t.Log(fs)
+
+ entryGot, err := repo.Get(entry.ID)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ if !entryGot.Equals(entry) {
+ t.Error("expected to get", entry, "but got", entryGot)
+ }
+}
+
+// TODO: Write unit tests for the remainder of the repo methods
+
+func setupRepository() (repo Repository, entry1, entry2 types.Entry, err error) {
+ fs := make(vfs.MemoryFS)
+ repo = newRepository("./data", fs)
+
+ entry1Str := `
+ {
+ "Body": "Body text here",
+ "Shared": [
+ { "Name": "Foo", "Is": true },
+ { "Name": "Bar", "Is": false }
+ ]
+ }
+ `
+ entry1, err = types.NewEntry([]byte(entry1Str), fs)
+ if err != nil {
+ return
+ }
+
+ entry2Str := `
+ {
+ "Body": "Body text here",
+ "Shared": [
+ { "Name": "Foo", "Is": true },
+ { "Name": "Bar", "Is": true },
+ { "Name": "Baz", "Is": false }
+ ]
+ }
+ `
+ entry2, err = types.NewEntry([]byte(entry2Str), fs)
+ return
+}