// Add inserts relationships, views, and patterns for testing. func Add(context interface{}, db *db.DB, items []item.Item, rels []relationship.Relationship, views []view.View, patterns []pattern.Pattern) error { for _, itm := range items { if err := item.Upsert(context, db, &itm); err != nil { return err } } for _, rel := range rels { if err := relationship.Upsert(context, db, &rel); err != nil { return err } } for _, pat := range patterns { if err := pattern.Upsert(context, db, &pat); err != nil { return err } } for _, vw := range views { if err := view.Upsert(context, db, &vw); err != nil { return err } } return nil }
// Add inserts items for testing. func Add(context interface{}, db *db.DB, items []item.Item) error { for _, it := range items { if err := item.Upsert(context, db, &it); err != nil { return err } } return nil }
// TestGetByID tests if we can get a single item from the db. func TestGetByID(t *testing.T) { tests.ResetLog() defer tests.DisplayLog() db, err := db.NewMGO(tests.Context, tests.TestSession) if err != nil { t.Fatalf("\t%s\tShould be able to get a Mongo session : %v", tests.Failed, err) } defer db.CloseMGO(tests.Context) defer func() { if err := itemfix.Remove(tests.Context, db, prefix); err != nil { t.Fatalf("\t%s\tShould be able to remove the items : %v", tests.Failed, err) } t.Logf("\t%s\tShould be able to remove the items.", tests.Success) }() t.Log("Given the need to get an item in the database by ID.") { t.Log("\tWhen starting from an empty items collection") { items, err := itemfix.Get() if err != nil { t.Fatalf("\t%s\tShould be able retrieve item fixture : %s", tests.Failed, err) } var itemIDs []string for _, it := range items { if err := item.Upsert(tests.Context, db, &it); err != nil { t.Fatalf("\t%s\tShould be able to upsert items : %s", tests.Failed, err) } itemIDs = append(itemIDs, it.ID) } t.Logf("\t%s\tShould be able to upsert items.", tests.Success) itmBack, err := item.GetByID(tests.Context, db, itemIDs[0]) if err != nil { t.Fatalf("\t%s\tShould be able to get an item by ID : %s", tests.Failed, err) } t.Logf("\t%s\tShould be able to get an item by ID.", tests.Success) // Check equality for all immutable fields: ID, Version, Data. Timestamps will change on Upsert. if !reflect.DeepEqual(items[0].Data, itmBack.Data) || (items[0].ID != itmBack.ID) || (items[0].Version != itmBack.Version) { t.Logf("\t%+v", items[0]) t.Logf("\t%+v", itmBack) t.Fatalf("\t%s\tShould be able to get back the same item.", tests.Failed) } t.Logf("\t%s\tShould be able to get back the same item.", tests.Success) } } }
// TestGetByIDs tests if we can get items from the db. func TestGetByIDs(t *testing.T) { tests.ResetLog() defer tests.DisplayLog() db, err := db.NewMGO(tests.Context, tests.TestSession) if err != nil { t.Fatalf("\t%s\tShould be able to get a Mongo session : %v", tests.Failed, err) } defer db.CloseMGO(tests.Context) defer func() { if err := itemfix.Remove(tests.Context, db, prefix); err != nil { t.Fatalf("\t%s\tShould be able to remove the items : %v", tests.Failed, err) } t.Logf("\t%s\tShould be able to remove the items.", tests.Success) }() t.Log("Given the need to get items in the database by IDs.") { t.Log("\tWhen starting from an empty items collection") { items1, err := itemfix.Get() if err != nil { t.Fatalf("\t%s\tShould be able retrieve item fixture : %s", tests.Failed, err) } var itemIDs []string for _, it := range items1 { if err := item.Upsert(tests.Context, db, &it); err != nil { t.Fatalf("\t%s\tShould be able to upsert items : %s", tests.Failed, err) } itemIDs = append(itemIDs, it.ID) } t.Logf("\t%s\tShould be able to upsert items.", tests.Success) items2, err := item.GetByIDs(tests.Context, db, itemIDs) if err != nil { t.Fatalf("\t%s\tShould be able to get items by IDs : %s", tests.Failed, err) } t.Logf("\t%s\tShould be able to get items by IDs.", tests.Success) if len(items1) != len(items2) { t.Logf("\t%+v", items1) t.Logf("\t%+v", items2) t.Fatalf("\t%s\tShould be able to get back the same items.", tests.Failed) } t.Logf("\t%s\tShould be able to get back the same items.", tests.Success) } } }
// Import imports an item into the items collections and into the graph database. func Import(context interface{}, db *db.DB, graph *cayley.Handle, itm *item.Item) error { log.Dev(context, "Import", "Started : ID[%s]", itm.ID) // If the item exists and is different than the provided item, // we need to remove existing relationships. if itm.ID != "" { // Get the item if it exists. itmOrig, err := item.GetByID(context, db, itm.ID) if err != nil { if err != item.ErrNotFound { log.Error(context, "Import", err, "Completed") return err } } // If the item exits, we need to determine if the item is the // same as the original. If not, we need to update the // relationships. if itmOrig.ID != "" { // If the item is identical, we don't have to do anything. if reflect.DeepEqual(itmOrig, itm) { log.Dev(context, "Import", "Completed") return nil } // If the item is not identical, remove the stale relationships by // preparing an item map. itmMap := map[string]interface{}{ "item_id": itmOrig.ID, "type": itmOrig.Type, "version": itmOrig.Version, "data": itmOrig.Data, } // Remove the corresponding relationships from the graph. if err := wire.RemoveFromGraph(context, db, graph, itmMap); err != nil { log.Error(context, "Import", err, "Completed") return err } } } // Add the item to the items collection. if err := item.Upsert(context, db, itm); err != nil { log.Error(context, "Import", err, "Completed") return err } // Prepare the generic item data map. itmMap := map[string]interface{}{ "item_id": itm.ID, "type": itm.Type, "version": itm.Version, "data": itm.Data, } // Infer relationships and add them to the graph. if err := wire.AddToGraph(context, db, graph, itmMap); err != nil { log.Error(context, "Import", err, "Completed") return err } log.Dev(context, "Import", "Completed") return nil }
// TestUpsertDelete tests if we can add/remove an item to/from the db. func TestUpsertDelete(t *testing.T) { tests.ResetLog() defer tests.DisplayLog() db, err := db.NewMGO(tests.Context, tests.TestSession) if err != nil { t.Fatalf("\t%s\tShould be able to get a Mongo session : %v", tests.Failed, err) } defer db.CloseMGO(tests.Context) defer func() { if err := itemfix.Remove(tests.Context, db, prefix); err != nil { t.Fatalf("\t%s\tShould be able to remove the items : %v", tests.Failed, err) } t.Logf("\t%s\tShould be able to remove the items.", tests.Success) }() t.Log("Given the need to upsert and delete items.") { t.Log("\tWhen starting from an empty items collection") { //---------------------------------------------------------------------- // Get the fixture. items, err := itemfix.Get() if err != nil { t.Fatalf("\t%s\tShould be able retrieve item fixture : %s", tests.Failed, err) } //---------------------------------------------------------------------- // Upsert the item. if err := item.Upsert(tests.Context, db, &items[0]); err != nil { t.Fatalf("\t%s\tShould be able to upsert a item : %s", tests.Failed, err) } t.Logf("\t%s\tShould be able to upsert a item.", tests.Success) //---------------------------------------------------------------------- // Get the item. itemsBack, err := item.GetByIDs(tests.Context, db, []string{items[0].ID}) if err != nil { t.Fatalf("\t%s\tShould be able to get the item by ID : %s", tests.Failed, err) } t.Logf("\t%s\tShould be able to get the item by ID.", tests.Success) //---------------------------------------------------------------------- // Check that we got the item we expected. if items[0].ID != itemsBack[0].ID { t.Logf("\t%+v", items[0]) t.Logf("\t%+v", itemsBack[0]) t.Fatalf("\t%s\tShould be able to get back the same item.", tests.Failed) } t.Logf("\t%s\tShould be able to get back the same item.", tests.Success) //---------------------------------------------------------------------- // Check that CreatedAt and UpdatedAt were set. if itemsBack[0].CreatedAt.IsZero() || itemsBack[0].UpdatedAt.IsZero() { t.Fatalf("\t%s\tShould set CreatedAt and UpdatedAt on upsert.", tests.Failed) } t.Logf("\t%s\tShould set CreatedAt and UpdatedAt on upsert.", tests.Success) //---------------------------------------------------------------------- // Delete the item. if err := item.Delete(tests.Context, db, items[0].ID); err != nil { t.Fatalf("\t%s\tShould be able to delete the item : %s", tests.Failed, err) } t.Logf("\t%s\tShould be able to delete the item.", tests.Success) //---------------------------------------------------------------------- // Get the item. itemsBack, err = item.GetByIDs(tests.Context, db, []string{items[0].ID}) if len(itemsBack) != 0 { t.Fatalf("\t%s\tShould generate an error when getting an item with the deleted ID : %s", tests.Failed, err) } t.Logf("\t%s\tShould generate an error when getting an item with the deleted ID.", tests.Success) } } }