private static NavigationCollectionRepository <Author, ICollection <Book>, Book> GetBooksNavRepo(Author author)
        {
            var item = new AlreadyLoadedItem <Author>(author, null);
            var repo = new NavigationCollectionRepository <Author, ICollection <Book>, Book>(item, a => a.Books, new DefaultNavigationSetter <Author, ICollection <Book> >(a => a.Books));

            return(repo);
        }
        public IRestResource GetFullResource(IDeferredItem <TItem> item, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            var eventWrapper = new DataEventWrapper <TNav>(dataTransaction, navRepository);

            eventWrapper.TryWrapEvents(_navTools.RepoEvents);

            var context = new FullEngineContext <TNav>(eventWrapper.Transaction, eventWrapper.Repository, _subContext);

            return(new EngineRestCollection <TNav>(context));
        }
        public void AttachNewItem_NullCollection_CreatesCollection()
        {
            var author = new Author
            {
                Books = null
            };

            NavigationCollectionRepository <Author, ICollection <Book>, Book> repo = GetBooksNavRepo(author);

            var book = repo.CreateAndAttachItem();

            Assert.NotNull(author.Books);
            Assert.Contains(book, author.Books);
        }
        public void AttachNewItem_EmptyCollection_AddsItem()
        {
            var books  = new List <Book>();
            var author = new Author
            {
                Books = books
            };

            NavigationCollectionRepository <Author, ICollection <Book>, Book> repo = GetBooksNavRepo(author);

            var book = repo.CreateAndAttachItem();

            Assert.Contains(book, books);
        }
        public void MarkDeleted_Collection_RemovesTestData()
        {
            var testBook = new Book {
                Title = "Test"
            };

            var author = new Author
            {
                Books = new List <Book>
                {
                    testBook
                }
            };

            NavigationCollectionRepository <Author, ICollection <Book>, Book> repo = GetBooksNavRepo(author);

            repo.MarkDeleted(testBook);

            Assert.Equal(0, author.Books.Count);
        }
        public void GetAllItemsQuery_Collection_ContainsTestData()
        {
            var testBook = new Book {
                Title = "Test"
            };

            var author = new Author
            {
                Books = new List <Book>
                {
                    testBook
                }
            };

            NavigationCollectionRepository <Author, ICollection <Book>, Book> repo = GetBooksNavRepo(author);

            var bookQuery = repo.GetAllItems().ToList();

            Assert.Contains(testBook, bookQuery);
        }
        public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction)
        {
            IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter);

            IDataTransaction transaction = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ?
            var navContext = new FullEngineContext <TNav>(transaction, navRepository, _subContext);

            var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext);

            IEnumerable deserializedCollection = (IEnumerable)deserializedValue;  // todo null ?

            foreach (object deserializedItem in deserializedCollection)
            {
                var itemData = new RestItemData(deserializedItem);

                DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync);

                var            navEngineItem  = new EngineRestItem <TNav>(navContext, deferredItem);
                Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData);
            }

            // TODO: remove items that were not located?
        }