diff --git a/crm/repository/content_test.go b/crm/repository/content_test.go new file mode 100644 index 000000000..aa3a70821 --- /dev/null +++ b/crm/repository/content_test.go @@ -0,0 +1,119 @@ +package repository + +import ( + "context" + "encoding/json" + "github.com/crusttech/crust/crm/types" + "testing" +) + +type testContentRow struct { + Name string `db:"name"` + Value string `db:"value"` +} + +func TestContent(t *testing.T) { + repository := NewContent(context.TODO()).With(context.Background()) + + // clean up tables + { + for _, name := range []string{"crm_module", "crm_module_content"} { + _, err := db().Exec("truncate " + name) + assert(t, err == nil, "Error when clearing "+name+": %+v", err) + } + } + + fields, err := json.Marshal([]types.Field{ + types.Field{ + Name: "name", + Type: "input", + }, + types.Field{ + Name: "email", + Type: "email", + }, + }) + assert(t, err == nil, "Error when encoding JSON fields: %+v", err) + + module := &types.Module{ + Name: "Test", + } + (&module.Fields).Scan(fields) + + // set up a module + { + _, err := NewModule(context.TODO()).With(context.Background()).Create(module) + assert(t, err == nil, "Error when creating module: %+v", err) + assert(t, module.ID > 0, "Expected auto generated ID") + } + + content := &types.Content{ + ModuleID: module.ID, + } + (&content.Fields).Scan(func() []byte { + b, _ := json.Marshal([]testContentRow{ + testContentRow{"name", "Tit Petric"}, + testContentRow{"email", "tit.petric@example.com"}, + }) + return b + }()) + + // now work with content + { + // create content + m, err := repository.Create(content) + assert(t, err == nil, "Error when creating content: %+v", err) + assert(t, m.ID > 0, "Expected auto generated ID") + + // fetch created content + { + ms, err := repository.FindByID(m.ID) + assert(t, err == nil, "Error when retrieving content by id: %+v", err) + assert(t, ms.ID == m.ID, "Expected ID from database to match, %d != %d", m.ID, ms.ID) + assert(t, ms.ModuleID == m.ModuleID, "Expected Module ID from database to match, %d != %d", m.ModuleID, ms.ModuleID) + + fields := make([]testContentRow, 0) + err = json.Unmarshal(ms.Fields, &fields) + assert(t, err == nil, "Didn't expect error when unmarshalling: %+v", err) + assert(t, len(fields) == 2, "Expected different field count: %d != %d", 2, len(fields)) + assert(t, fields[0].Name == "name", "Expected field.0 type = name, got %s", fields[0].Name) + assert(t, fields[1].Name == "email", "Expected field.1 type = email, got %s", fields[1].Name) + } + + // update created content + { + _, err := repository.Update(m) + assert(t, err == nil, "Error when updating content, %+v", err) + } + + // re-fetch content + { + ms, err := repository.FindByID(m.ID) + assert(t, err == nil, "Error when retrieving content by id: %+v", err) + assert(t, ms.ID == m.ID, "Expected ID from database to match, %d != %d", m.ID, ms.ID) + assert(t, ms.ModuleID == m.ModuleID, "Expected ID from database to match, %d != %d", m.ModuleID, ms.ModuleID) + } + + // fetch all contents + { + ms, err := repository.Find() + assert(t, err == nil, "Error when retrieving contents: %+v", err) + assert(t, len(ms) == 1, "Expected one content, got %d", len(ms)) + assert(t, ms[0].ModuleID == m.ModuleID, "Expected content module to match, %s != %s", m.ModuleID, ms[0].ModuleID) + } + + // re-fetch content + { + err := repository.DeleteByID(m.ID) + assert(t, err == nil, "Error when retrieving content by id: %+v", err) + } + + // fetch all contents + { + ms, err := repository.Find() + assert(t, err == nil, "Error when retrieving contents: %+v", err) + assert(t, len(ms) == 0, "Expected one content, got %d", len(ms)) + } + } + +} diff --git a/crm/repository/main_test.go b/crm/repository/main_test.go new file mode 100644 index 000000000..6cb09da08 --- /dev/null +++ b/crm/repository/main_test.go @@ -0,0 +1,52 @@ +package repository + +import ( + "github.com/joho/godotenv" + "github.com/namsral/flag" + "github.com/titpetric/factory" + "os" + "testing" +) + +func TestMain(m *testing.M) { + // @todo this is a very optimistic initialization, make it more robust + godotenv.Load("../../.env") + + prefix := "sam" + dsn := "" + + p := func(s string) string { + return prefix + "-" + s + } + + flag.StringVar(&dsn, p("db-dsn"), "crust:crust@tcp(db1:3306)/crust?collation=utf8mb4_general_ci", "DSN for database connection") + flag.Parse() + + if testing.Short() { + return + } + + factory.Database.Add("default", dsn) + + db := factory.Database.MustGet() + db.Profiler = &factory.Database.ProfilerStdout + + os.Exit(m.Run()) +} + +func db() *factory.DB { + return factory.Database.MustGet() +} + +func must(t *testing.T, err error) { + if err != nil { + t.Fatalf("Error: %v", err) + } +} + +func assert(t *testing.T, ok bool, format string, args ...interface{}) bool { + if !ok { + t.Fatalf(format, args...) + } + return ok +} diff --git a/crm/repository/module_test.go b/crm/repository/module_test.go new file mode 100644 index 000000000..61104bcbd --- /dev/null +++ b/crm/repository/module_test.go @@ -0,0 +1,75 @@ +package repository + +import ( + "context" + "github.com/crusttech/crust/crm/types" + "testing" +) + +func TestModule(t *testing.T) { + + repository := NewModule(context.TODO()).With(context.Background()) + + // clean up tables + { + _, err := db().Exec("truncate crm_module") + assert(t, err == nil, "Error when clearing crm_module: %+v", err) + } + + // the module object we're working with + module := &types.Module{ + Name: "Test", + } + + { + // create module + m, err := repository.Create(module) + assert(t, err == nil, "Error when creating module: %+v", err) + assert(t, m.ID > 0, "Expected auto generated ID") + + // fetch created module + { + ms, err := repository.FindByID(m.ID) + assert(t, err == nil, "Error when retrieving module by id: %+v", err) + assert(t, ms.ID == m.ID, "Expected ID from database to match, %d != %d", m.ID, ms.ID) + assert(t, ms.Name == m.Name, "Expected Name from database to match, %s != %s", m.Name, ms.Name) + } + + // update created module + { + m.Name = "Updated test" + _, err := repository.Update(m) + assert(t, err == nil, "Error when updating module, %+v", err) + } + + // re-fetch module + { + ms, err := repository.FindByID(m.ID) + assert(t, err == nil, "Error when retrieving module by id: %+v", err) + assert(t, ms.ID == m.ID, "Expected ID from database to match, %d != %d", m.ID, ms.ID) + assert(t, ms.Name == m.Name, "Expected Name from database to match, %s != %s", m.Name, ms.Name) + } + + // fetch all modules + { + ms, err := repository.Find() + assert(t, err == nil, "Error when retrieving modules: %+v", err) + assert(t, len(ms) == 1, "Expected one module, got %d", len(ms)) + assert(t, ms[0].Name == m.Name, "Expected module name to match, %s != %s", m.Name, ms[0].Name) + } + + // re-fetch module + { + err := repository.DeleteByID(m.ID) + assert(t, err == nil, "Error when deleting module by id: %+v", err) + } + + // fetch all modules + { + ms, err := repository.Find() + assert(t, err == nil, "Error when retrieving modules: %+v", err) + assert(t, len(ms) == 0, "Expected no modules, got %d", len(ms)) + } + } + +}