public void GetBookRecord_BookIsThere_Succeeds()
        {
            //first make a book so that we know it is there
            var id       = CreateBookRecord();
            var bookjson = _client.GetSingleBookRecord(id);

            Assert.AreEqual(id, bookjson.bookInstanceId.Value);

            // Partial matches are no good
            Assert.IsNull(_client.GetSingleBookRecord(new Guid().ToString()));

            // Our lookup uses the logged in user as part of the query.
            // Ensure the lookup fails if not logged in as the uploader.
            _client.Logout();
            Assert.IsNull(_client.GetSingleBookRecord(id));
        }
        public void UploadBook_SetsInterestingParseFieldsCorrectly()
        {
            Login();
            var bookFolder = MakeBook(MethodBase.GetCurrentMethod().Name, "myId", "me", "something");

            _uploader.UploadBook(bookFolder, new NullProgress());
            var bookInstanceId = "myId" + _thisTestId;
            var bookRecord     = _parseClient.GetSingleBookRecord(bookInstanceId);

            // Verify new upload
            Assert.That(bookRecord.harvestState.Value, Is.EqualTo("New"));
            Assert.That(bookRecord.tags[0].Value, Is.EqualTo("system:Incoming"), "New books should always get the system:Incoming tag.");
            Assert.That(bookRecord.updateSource.Value.StartsWith("BloomDesktop "), Is.True, "updateSource should start with BloomDesktop when uploaded");
            Assert.That(bookRecord.updateSource.Value, Is.Not.EqualTo("BloomDesktop old"), "updateSource should not equal 'BloomDesktop old' when uploaded from current Bloom");
            DateTime lastUploadedDateTime = bookRecord.lastUploaded.iso.Value;
            var      differenceBetweenNowAndCreationOfJson = DateTime.UtcNow - lastUploadedDateTime;

            Assert.That(differenceBetweenNowAndCreationOfJson, Is.GreaterThan(TimeSpan.FromSeconds(0)), "lastUploaded should be a valid date representing now-ish");
            Assert.That(differenceBetweenNowAndCreationOfJson, Is.LessThan(TimeSpan.FromSeconds(5)), "lastUploaded should be a valid date representing now-ish");

            // Set up for re-upload
            _parseClient.SetBookRecord(JsonConvert.SerializeObject(
                                           new
            {
                bookInstanceId,
                updateSource = "not Bloom",
                tags         = new string[0],
                lastUploaded = (ParseServerDate)null,
                harvestState = "Done"
            }));
            bookRecord = _parseClient.GetSingleBookRecord(bookInstanceId);
            Assert.That(bookRecord.harvestState.Value, Is.EqualTo("Done"));
            Assert.That(bookRecord.tags, Is.Empty);
            Assert.That(bookRecord.updateSource.Value, Is.EqualTo("not Bloom"));
            Assert.That(bookRecord.lastUploaded.Value, Is.Null);

            _uploader.UploadBook(bookFolder, new NullProgress());
            bookRecord = _parseClient.GetSingleBookRecord(bookInstanceId);

            // Verify re-upload
            Assert.That(bookRecord.harvestState.Value, Is.EqualTo("Updated"));
            Assert.That(bookRecord.tags[0].Value, Is.EqualTo("system:Incoming"), "Re-uploaded books should always get the system:Incoming tag.");
            Assert.That(bookRecord.updateSource.Value.StartsWith("BloomDesktop "), Is.True, "updateSource should start with BloomDesktop when re-uploaded");
            Assert.That(bookRecord.updateSource.Value, Is.Not.EqualTo("BloomDesktop old"), "updateSource should not equal 'BloomDesktop old' when uploaded from current Bloom");
            lastUploadedDateTime = bookRecord.lastUploaded.iso.Value;
            differenceBetweenNowAndCreationOfJson = DateTime.UtcNow - lastUploadedDateTime;
            Assert.That(differenceBetweenNowAndCreationOfJson, Is.GreaterThan(TimeSpan.FromSeconds(0)), "lastUploaded should be a valid date representing now-ish");
            Assert.That(differenceBetweenNowAndCreationOfJson, Is.LessThan(TimeSpan.FromSeconds(5)), "lastUploaded should be a valid date representing now-ish");

            _parseClient.DeleteBookRecord(bookRecord.objectId.Value);
        }