"use strict";

describe("Zotero.DataObject", function() {
	var types = ['collection', 'item', 'search'];
	
	describe("#loadAllData()", function () {
		it("should load data on a regular item", function* () {
			var item = new Zotero.Item('book');
			var id = yield item.saveTx();
			item = yield Zotero.Items.getAsync(id);
			yield item.loadAllData();
			assert.throws(item.getNote.bind(item), 'getNote() can only be called on notes and attachments');
		})
		
		it("should load data on an attachment item", function* () {
			var item = new Zotero.Item('attachment');
			var id = yield item.saveTx();
			item = yield Zotero.Items.getAsync(id);
			yield item.loadAllData();
			assert.equal(item.getNote(), '');
		})
		
		it("should load data on a note item", function* () {
			var item = new Zotero.Item('note');
			var id = yield item.saveTx();
			item = yield Zotero.Items.getAsync(id);
			yield item.loadAllData();
			assert.equal(item.getNote(), '');
		})
	})
	
	describe("#save()", function () {
		it("should add new identifiers to cache", function* () {
			// Collection
			var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType('collection');
			var obj = new Zotero.Collection;
			obj.name = "Test";
			var id = yield obj.saveTx();
			var { libraryID, key } = objectsClass.getLibraryAndKeyFromID(id);
			assert.typeOf(key, 'string');
			assert.equal(objectsClass.getIDFromLibraryAndKey(libraryID, key), id);
			
			// Search
			var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType('search');
			var obj = new Zotero.Search;
			obj.name = "Test";
			var id = yield obj.saveTx();
			var { libraryID, key } = objectsClass.getLibraryAndKeyFromID(id);
			assert.typeOf(key, 'string');
			assert.equal(objectsClass.getIDFromLibraryAndKey(libraryID, key), id);
			
			// Item
			var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType('item');
			var obj = new Zotero.Item('book');
			var id = yield obj.saveTx();
			var { libraryID, key } = objectsClass.getLibraryAndKeyFromID(id);
			assert.typeOf(key, 'string');
			assert.equal(objectsClass.getIDFromLibraryAndKey(libraryID, key), id);
		})
	})
})
