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); }
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); }
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); }
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)); } } } }
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); }
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(); }
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(); }
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); }
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); } }