public async Task<HttpResponseMessage> Post(Book model)
        {
            var book = await _repository.AddAsync(model);

            var response = Request.CreateResponse(HttpStatusCode.Created, book);
            return response;
        }
        public async Task<HttpResponseMessage> Put(int id, Book model)
        {
            model.Id = id;
            var book = await _repository.UpdateAsync(model);

            var response = Request.CreateResponse(HttpStatusCode.OK, book);
            return response;
        }
        public Task<Book> UpdateAsync(Book book)
        {
            if (book.Authors == null || !book.Authors.Any())
            {
                throw new BadRequestException("At least 1 author required.");
            }

            return _db.UpdateBookAsync(book);
        }
Exemple #4
0
        public void CloneTest()
        {
            var book = new Book
            {
                Id = 7,
                Pages = 51,
                Published = DateTime.Now.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Publisher = "Alpina Books",
                Title = "CLR via C#",
                Image = "https://www.google.ru/images/srpr/logo11w.png",
                Authors = new List<Author>
                {
                    new Author
                    {
                        Id = 5,
                        FirstName = "Jeff",
                        LastName = "Richter"
                    },
                    new Author
                    {
                        Id = 7,
                        FirstName = "Bill",
                        LastName = "Gates"
                    }
                }
            };

            var result = (Book) book.Clone();

            Assert.AreEqual(book.Id, result.Id);
            Assert.AreEqual(book.Pages, result.Pages);
            Assert.AreEqual(book.Published, result.Published);
            Assert.AreEqual(book.Isbn, result.Isbn);
            Assert.AreEqual(book.Publisher, result.Publisher);
            Assert.AreEqual(book.Title, result.Title);
            Assert.AreEqual(book.Image, result.Image);
            Assert.AreEqual(book.Authors.Count, result.Authors.Count);

            foreach (var author in result.Authors)
            {
                CollectionAssert.DoesNotContain(book.Authors, author);
                Assert.IsTrue(book.Authors.Any(a => a.Id == author.Id));
            }
        }
        public void AddBookWithAuthorIdsTest()
        {
            var author1 = new Author
            {
                FirstName = "Jeff",
                LastName = "Richter"
            };
            author1 = _db.AddAuthorAsync(author1).Result;

            var author2 = new Author
            {
                FirstName = "Bill",
                LastName = "Gates"
            };
            author2 = _db.AddAuthorAsync(author2).Result;

            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png",
                Authors = new List<Author>
                {
                    new Author { Id = author1.Id },
                    new Author { Id = author2.Id }
                }
            };

            var result = _db.AddBookAsync(book).Result;

            Assert.AreEqual(2, result.Authors.Count);

            var auth1 = result.Authors.FirstOrDefault(a => a.Id == author1.Id);
            var auth2 = result.Authors.FirstOrDefault(a => a.Id == author2.Id);
            Assert.IsNotNull(auth1);
            Assert.IsNotNull(auth2);
            Assert.AreEqual(author1.FirstName, auth1.FirstName);
            Assert.AreEqual(author1.LastName, auth1.LastName);
            Assert.AreEqual(author2.FirstName, auth2.FirstName);
            Assert.AreEqual(author2.LastName, auth2.LastName);
        }
Exemple #6
0
        public async Task<Book> AddBookAsync(Book book)
        {
            try
            {
                await _lock.WaitAsync(OneManyMode.Exclusive);

                book = Copy(book);

                // check consistency
                CheckBookRelations(book);

                // set id
                book.Id = _bookIds++;

                // load book relations
                LoadBookRelations(book);

                // add to storage
                _books.Add(book.Id, book);

                // update indexes
                _booksByTitle.Add(book);
                _booksByPublishedDateDesc.Add(book);
                UpdateBookIndexes();

                // sync author relations
                if (book.Authors != null)
                {
                    foreach (var author in book.Authors)
                    {
                        AddAuthorBookRelationship(book, author);
                    }
                }
            }
            finally
            {
                _lock.Release();
            }

            return Copy(book);
        }
        public void AddBookWithoutAuthorsTest()
        {
            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png"
            };

            try
            {
                _repository.AddAsync(book).Wait();
            }
            catch (Exception)
            {
                return;
            }

            Assert.Fail();
        }
        public void GetBookTest()
        {
            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png"
            };

            book = _db.AddBookAsync(book).Result;

            var result = _db.GetBookAsync(book.Id).Result;

            Assert.AreNotSame(book, result);
            Assert.AreEqual(book.Id, result.Id);
            Assert.AreEqual(book.Title, result.Title);
        }
        public void DeleteBookTest()
        {
            var book1 = new Book
            {
                Title = "Node.js in Action",
                Published = DateTime.Now.Date.AddYears(-4)
            };
            var book2 = new Book
            {
                Title = "CLR via C#",
                Published = DateTime.Now.Date.AddYears(-3)
            };
            var book3 = new Book
            {
                Title = "Learning Python",
                Published = DateTime.Now.Date.AddYears(-10)
            };

            _db.AddBookAsync(book1).Wait();
            book2 = _db.AddBookAsync(book2).Result;
            _db.AddBookAsync(book3).Wait();

            _db.DeleteBookAsync(book2.Id).Wait();

            var result = _db.GetBooksByTitleAsync().Result;

            Assert.AreEqual(2, result.Count);
            Assert.IsTrue(result.All(b => b.Id != book2.Id));
        }
        public void BooksByTitleUpdateTest()
        {
            var book1 = new Book
            {
                Title = "Node.js in Action"
            };
            var book2 = new Book
            {
                Title = "CLR via C#"
            };
            var book3 = new Book
            {
                Title = "Learning Python"
            };

            book1 = _db.AddBookAsync(book1).Result;
            book2 = _db.AddBookAsync(book2).Result;
            book3 = _db.AddBookAsync(book3).Result;

            book1.Title = "A " + book1.Title;
            book1 = _db.UpdateBookAsync(book1).Result;

            var result = _db.GetBooksByTitleAsync().Result;

            Assert.AreEqual(3, result.Count);
            Assert.AreEqual(book1.Title, result[0].Title);
            Assert.AreEqual(book2.Title, result[1].Title);
            Assert.AreEqual(book3.Title, result[2].Title);
        }
        public void BooksByTitleTest()
        {
            var book1 = new Book
            {
                Title = "Learning Python",
                Pages = 1400,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-10),
                Isbn = Guid.NewGuid().ToString()
            };

            var book2 = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png"
            };

            book1 = _db.AddBookAsync(book1).Result;
            book2 = _db.AddBookAsync(book2).Result;

            var result = _db.GetBooksByTitleAsync().Result;

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(book2.Title, result[0].Title);
            Assert.AreEqual(book1.Title, result[1].Title);
        }
Exemple #12
0
 private void CheckBookRelations(Book book)
 {
     if (book.Authors != null)
     {
         foreach (var author in book.Authors)
         {
             if (author.Id <= 0 || !_authors.ContainsKey(author.Id))
             {
                 throw new NotFoundException(string.Format("Could not find author {0} {1} with id: {2}",
                     author.FirstName, author.LastName, author.Id));
             }
         }
     }
 }
Exemple #13
0
 private static Book Copy(Book book)
 {
     return book != null ? (Book) book.Clone() : null;
 }
        public void UpdateBookWithUnexistingIdTest()
        {
            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png"
            };

            book = _db.AddBookAsync(book).Result;
            book.Id++;

            try
            {
                _db.UpdateBookAsync(book).Wait();
            }
            catch (Exception)
            {
                return;
            }

            Assert.Fail();
        }
        public void AddBookWithUnexistingAuthorTest()
        {
            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png",
                Authors = new List<Author>
                {
                    new Author()
                }
            };

            try
            {
                _db.AddBookAsync(book).Wait();
            }
            catch (Exception)
            {
                return;
            }

            Assert.Fail();
        }
        public void AddBookWithoutAuthorsTest()
        {
            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png"
            };

            var result = _db.AddBookAsync(book).Result;

            Assert.IsTrue(result.Id > 0);
            Assert.AreNotSame(book, result);
            Assert.AreEqual(book.Title, result.Title);
            Assert.AreEqual(book.Pages, result.Pages);
            Assert.AreEqual(book.Publisher, result.Publisher);
            Assert.AreEqual(book.Published, result.Published);
            Assert.AreEqual(book.Isbn, result.Isbn);
            Assert.AreEqual(book.Image, result.Image);
        }
Exemple #17
0
        private void AddAuthorBookRelationship(Book book, Author author)
        {
            book = _books[book.Id];
            author = _authors[author.Id];

            if (_authorBooks.ContainsKey(author))
            {
                _authorBooks[author].Add(book);
            }
            else
            {
                _authorBooks.Add(author, new List<Book> {book});
            }
        }
        public void Initialize()
        {
            var author1 = new Author
            {
                FirstName = "Jeffrey",
                LastName = "Richter"
            };
            author1 = _db.AddAuthorAsync(author1).Result;

            var book1 = new Book
            {
                Title = "CLR via C# (4th Edition)",
                Pages = 896,
                Publisher = "Microsoft Press",
                Published = new DateTime(2012, 11, 25),
                Isbn = "978-0-735-66745-7",
                Image = "http://ecx.images-amazon.com/images/I/41zZ5aN3ypL.jpg",
                Authors = new List<Author>
                {
                    author1
                }
            };

            _db.AddBookAsync(book1).Wait();

            var author2 = new Author
            {
                FirstName = "Mark",
                LastName = "Lutz"
            };
            author2 = _db.AddAuthorAsync(author2).Result;

            var book2 = new Book
            {
                Title = "Learning Python, 5th Edition",
                Pages = 1600,
                Publisher = "O'Reilly Media",
                Published = new DateTime(2013, 7, 6),
                Isbn = "978-1-449-35573-9",
                Image = "http://ecx.images-amazon.com/images/I/515iBchIIzL._SX379_BO1,204,203,200_.jpg",
                Authors = new List<Author>
                {
                    author2
                }
            };

            _db.AddBookAsync(book2).Wait();

            var author3 = new Author
            {
                FirstName = "Mike",
                LastName = "Cantelon"
            };

            author3 = _db.AddAuthorAsync(author3).Result;

            var book3 = new Book
            {
                Title = "Node.js in Action",
                Pages = 416,
                Publisher = "Manning Publications",
                Published = new DateTime(2013, 11, 28),
                Isbn = "978-1-617-29057-2",
                Image = "http://ecx.images-amazon.com/images/I/51twwFigyiL._SX397_BO1,204,203,200_.jpg",
                Authors = new List<Author>
                {
                    author3
                }
            };

            _db.AddBookAsync(book3).Wait();
        }
Exemple #19
0
 private void LoadBookRelations(Book book)
 {
     if (book.Authors != null)
     {
         var authors = book.Authors.Select(author => _authors[author.Id]).ToList();
         book.Authors = authors;
     }
 }
        public void UpdateBookTest()
        {
            var author1 = new Author
            {
                FirstName = "Jeff",
                LastName = "Richter"
            };
            author1 = _db.AddAuthorAsync(author1).Result;

            var author2 = new Author
            {
                FirstName = "Bill",
                LastName = "Gates"
            };
            author2 = _db.AddAuthorAsync(author2).Result;

            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png",
                Authors = new List<Author>
                {
                    author1
                }
            };

            book = _db.AddBookAsync(book).Result;

            book.Title += "2";
            book.Pages += 20;
            book.Publisher += "2";
            book.Published = book.Published.HasValue ? book.Published.Value.AddYears(2) : (DateTime?) null;
            book.Isbn += "2";
            book.Image += "2";
            book.Authors = new List<Author> { author2 };

            var result = _db.UpdateBookAsync(book).Result;

            Assert.AreNotSame(book, result);
            Assert.AreEqual(book.Id, result.Id);
            Assert.AreEqual(book.Title, result.Title);
            Assert.AreEqual(book.Pages, result.Pages);
            Assert.AreEqual(book.Publisher, result.Publisher);
            Assert.AreEqual(book.Isbn, result.Isbn);
            Assert.AreEqual(book.Image, result.Image);
            Assert.AreEqual(1, result.Authors.Count);
            Assert.IsTrue(result.Authors.Any(a => a.Id == author2.Id ));
        }
        public void UpdateBookWithUnexistingAuthorTest()
        {
            var author = new Author
            {
                FirstName = "Jeff",
                LastName = "Richter"
            };
            author = _db.AddAuthorAsync(author).Result;

            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png",
                Authors = new List<Author>
                {
                    author
                }
            };

            book = _db.AddBookAsync(book).Result;

            book.Authors[0].Id++;

            try
            {
                _db.UpdateBookAsync(book).Wait();
            }
            catch (Exception)
            {
                return;
            }

            Assert.Fail();
        }
Exemple #22
0
        public async Task<Book> UpdateBookAsync(Book book)
        {
            try
            {
                await _lock.WaitAsync(OneManyMode.Exclusive);

                if (!_books.ContainsKey(book.Id))
                {
                    throw new NotFoundException(string.Format("Could not find book by id: {0}", book.Id));
                }

                // check consistency
                CheckBookRelations(book);

                book = Copy(book);
                var original = _books[book.Id];

                // updating author relations
                if (book.Authors != null)
                {
                    var deletedAuthors = original.Authors.Where(a => book.Authors.All(auth => auth.Id != a.Id));
                    foreach (var author in deletedAuthors)
                    {
                        DeleteAuthorBookRelationship(original, author);
                    }

                    var newAuthors = book.Authors.Where(a => original.Authors.All(auth => auth.Id != a.Id));
                    foreach (var author in newAuthors)
                    {
                        AddAuthorBookRelationship(original, author);
                    }
                }

                // updating book
                original.Title = book.Title;
                original.Authors = book.Authors;
                original.Pages = book.Pages;
                original.Publisher = book.Publisher;
                original.Published = book.Published;
                original.Isbn = book.Isbn;
                original.Image = book.Image;

                // updating indexes
                UpdateBookIndexes();

                return Copy(original);
            }
            finally
            {
                _lock.Release();
            }
        }
        public void AddBookWithAuthorTest()
        {
            var author = new Author
            {
                FirstName = "Jeff",
                LastName = "Richter"
            };
            author = _db.AddAuthorAsync(author).Result;

            var book = new Book
            {
                Title = "CLR via C#",
                Pages = 900,
                Publisher = "IT Books",
                Published = DateTime.Now.Date.AddYears(-5),
                Isbn = Guid.NewGuid().ToString(),
                Image = "https://www.google.ru/images/srpr/logo11w.png",
                Authors = new List<Author>
                {
                    author
                }
            };

            var result = _db.AddBookAsync(book).Result;

            Assert.AreEqual(1, result.Authors.Count);
            Assert.AreNotSame(author, result.Authors[0]);
            Assert.AreEqual(author.LastName, result.Authors[0].LastName);
        }
        public void BooksByPublishedDateUpdateTest()
        {
            var book1 = new Book
            {
                Title = "Node.js in Action",
                Published = DateTime.Now.Date.AddYears(-4)
            };
            var book2 = new Book
            {
                Title = "CLR via C#",
                Published = DateTime.Now.Date.AddYears(-3)
            };
            var book3 = new Book
            {
                Title = "Learning Python",
                Published = DateTime.Now.Date.AddYears(-10)
            };

            book1 = _db.AddBookAsync(book1).Result;
            book2 = _db.AddBookAsync(book2).Result;
            book3 = _db.AddBookAsync(book3).Result;

            book2.Published = book2.Published.HasValue ? book2.Published.Value.AddYears(-2) : (DateTime?) null;
            book2 = _db.UpdateBookAsync(book2).Result;

            var result = _db.GetBooksByPublishedDateAsync().Result;

            Assert.AreEqual(3, result.Count);
            Assert.AreEqual(book1.Title, result[0].Title);
            Assert.AreEqual(book2.Title, result[1].Title);
            Assert.AreEqual(book3.Title, result[2].Title);
        }
        public void BooksByPublishedDateDeleteTest()
        {
            var book1 = new Book
            {
                Title = "Node.js in Action",
                Published = DateTime.Now.Date.AddYears(-4)
            };
            var book2 = new Book
            {
                Title = "CLR via C#",
                Published = DateTime.Now.Date.AddYears(-3)
            };
            var book3 = new Book
            {
                Title = "Learning Python",
                Published = DateTime.Now.Date.AddYears(-10)
            };

            book1 = _db.AddBookAsync(book1).Result;
            book2 = _db.AddBookAsync(book2).Result;
            book3 = _db.AddBookAsync(book3).Result;

            _db.DeleteBookAsync(book2.Id).Wait();

            var result = _db.GetBooksByPublishedDateAsync().Result;

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(book1.Title, result[0].Title);
            Assert.AreEqual(book3.Title, result[1].Title);
        }
Exemple #26
0
        private void DeleteAuthorBookRelationship(Book book, Author author)
        {
            book = _books[book.Id];
            author = _authors[author.Id];

            var authorBooks = _authorBooks[author];
            authorBooks.Remove(book);
            if (!authorBooks.Any())
            {
                // no more books
                _authorBooks.Remove(author);
            }
        }