fixing some issues with how scribble was reading/writing. added tests
This commit is contained in:
parent
c2b94817bc
commit
77a7709b42
52
scribble.go
52
scribble.go
|
@ -95,21 +95,16 @@ func (d *Driver) Write(collection, resource string, v interface{}) error {
|
||||||
// Read a record from the database
|
// Read a record from the database
|
||||||
func (d *Driver) Read(path string, v interface{}) error {
|
func (d *Driver) Read(path string, v interface{}) error {
|
||||||
|
|
||||||
dir := d.dir + path
|
|
||||||
|
|
||||||
//
|
//
|
||||||
fi, err := os.Stat(path)
|
m, p := modePath(d.dir + path)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
switch m {
|
||||||
|
|
||||||
// if the path is a directory, attempt to read all entries into v
|
// if the path is a directory, attempt to read all entries into v
|
||||||
case fi.Mode().IsDir():
|
case "dir":
|
||||||
|
|
||||||
// read all the files in the transaction.Collection
|
// read all the files in the transaction.Collection
|
||||||
files, err := ioutil.ReadDir(dir)
|
files, err := ioutil.ReadDir(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// an error here just means the collection is either empty or doesn't exist
|
// an error here just means the collection is either empty or doesn't exist
|
||||||
}
|
}
|
||||||
|
@ -120,7 +115,7 @@ func (d *Driver) Read(path string, v interface{}) error {
|
||||||
// iterate over each of the files, attempting to read the file. If successful
|
// iterate over each of the files, attempting to read the file. If successful
|
||||||
// append the files to the collection of read files
|
// append the files to the collection of read files
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
b, err := ioutil.ReadFile(dir + "/" + file.Name())
|
b, err := ioutil.ReadFile(p + "/" + file.Name())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -133,10 +128,10 @@ func (d *Driver) Read(path string, v interface{}) error {
|
||||||
return json.Unmarshal([]byte("["+strings.Join(f, ",")+"]"), v)
|
return json.Unmarshal([]byte("["+strings.Join(f, ",")+"]"), v)
|
||||||
|
|
||||||
// if the path is a file, attempt to read the single file
|
// if the path is a file, attempt to read the single file
|
||||||
case !fi.Mode().IsDir():
|
case "file":
|
||||||
|
|
||||||
// read record from database
|
// read record from database
|
||||||
b, err := ioutil.ReadFile(dir + ".json")
|
b, err := ioutil.ReadFile(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -156,21 +151,28 @@ func (d *Driver) Delete(path string) error {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
// stat the file to determine if it is a file or dir
|
//
|
||||||
fi, err := os.Stat(path)
|
_, p := modePath(d.dir + path)
|
||||||
if err != nil {
|
|
||||||
return err
|
//
|
||||||
|
return os.RemoveAll(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func modePath(path string) (m, p string) {
|
||||||
|
|
||||||
|
// check for dir
|
||||||
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||||
|
|
||||||
|
// check for file
|
||||||
|
if _, err := os.Stat(path + ".json"); os.IsNotExist(err) {
|
||||||
|
fmt.Printf("No file or directory found at '%v'\n", path+".json")
|
||||||
|
}
|
||||||
|
|
||||||
|
return "file", path + ".json"
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
return "dir", path
|
||||||
// remove the collection from database
|
|
||||||
case fi.Mode().IsDir():
|
|
||||||
return os.Remove(d.dir + path)
|
|
||||||
|
|
||||||
// remove the record from database
|
|
||||||
default:
|
|
||||||
return os.Remove(d.dir + path + ".json")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// getOrCreateMutex creates a new collection specific mutex any time a collection
|
// getOrCreateMutex creates a new collection specific mutex any time a collection
|
||||||
|
|
127
scribble_test.go
Normal file
127
scribble_test.go
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
package scribble
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
//
|
||||||
|
type Friend struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
var (
|
||||||
|
db *Driver
|
||||||
|
testRoot = "./test_db"
|
||||||
|
friendsPath = "/friends"
|
||||||
|
friend0 = Friend{}
|
||||||
|
friend1 = Friend{Name: "wocket"}
|
||||||
|
friend2 = Friend{Name: "wasket"}
|
||||||
|
)
|
||||||
|
|
||||||
|
//
|
||||||
|
func init() {
|
||||||
|
startup()
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func startup() {
|
||||||
|
db, _ = New(testRoot, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func teardown() {
|
||||||
|
os.RemoveAll(testRoot)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func createFriend(t *testing.T) {
|
||||||
|
if err := db.Write(friendsPath, "friend1", friend1); err != nil {
|
||||||
|
t.Error("Failed to write", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func createFriends(t *testing.T) {
|
||||||
|
if err := db.Write(friendsPath, "friend1", friend1); err != nil {
|
||||||
|
t.Error("Failed to write", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := db.Write(friendsPath, "friend2", friend2); err != nil {
|
||||||
|
t.Error("Failed to write", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func TestNew(t *testing.T) {
|
||||||
|
if _, err := os.Stat(testRoot); os.IsNotExist(err) {
|
||||||
|
t.Error("Expected file, got none", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown()
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func TestWrite(t *testing.T) {
|
||||||
|
createFriend(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func TestRead(t *testing.T) {
|
||||||
|
createFriend(t)
|
||||||
|
|
||||||
|
if err := db.Read(friendsPath+"/friend1", &friend0); err != nil {
|
||||||
|
t.Error("Failed to read", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if friend0.Name == "" {
|
||||||
|
t.Error("Expected friend, have none")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func TestReadall(t *testing.T) {
|
||||||
|
createFriends(t)
|
||||||
|
|
||||||
|
friends := []Friend{}
|
||||||
|
if err := db.Read(friendsPath, &friends); err != nil {
|
||||||
|
t.Error("Failed to read", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(friends) <= 0 {
|
||||||
|
t.Error("Expected friends, have none")
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown()
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func TestDelete(t *testing.T) {
|
||||||
|
createFriend(t)
|
||||||
|
|
||||||
|
if err := db.Delete(friendsPath + "/friend1"); err != nil {
|
||||||
|
t.Error("Failed to delete", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fi, err := os.Stat(friendsPath + "/friend1"); fi != nil {
|
||||||
|
t.Error("Expected nothing, have friends", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown()
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func TestDeleteall(t *testing.T) {
|
||||||
|
createFriends(t)
|
||||||
|
|
||||||
|
if err := db.Delete(friendsPath); err != nil {
|
||||||
|
t.Error("Failed to delete ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fi, err := os.Stat(friendsPath); fi != nil {
|
||||||
|
t.Error("Expected nothing, have friends", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user