public async Task Handle_ReturnsGivenPrompt(int amount, int index)
        {
            //arrange
            const string expectedTitle   = "TestTitle";
            const string expectedContent = "TestContent";
            var          prompt          = new Prompt();

            for (var i = 0; i < amount; i++)
            {
                if (i == index)
                {
                    prompt = new Prompt {
                        Title = expectedTitle, PromptContent = expectedContent
                    };
                    DbContext.Prompts.Add(prompt);
                    await DbContext.SaveChangesAsync();
                }
                else
                {
                    DbContext.Prompts.Add(new Prompt());
                }
            }

            await DbContext.SaveChangesAsync();

            var query = new GetPromptQuery(prompt.Id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.Equal(prompt.Id, result.Id);
            Assert.Equal(expectedTitle, result.Title);
            Assert.Equal(expectedContent, result.PromptContent);
        }
        public async Task Handle_ReturnsPrompt_WhenTopLevelParentIsNotDraft(int depth)
        {
            //arrange
            var owner = new User {
                Username = "******"
            };
            var parent = new Prompt {
                IsDraft = false, Owner = owner
            };

            DbContext.Prompts.Add(parent);
            await DbContext.SaveChangesAsync();

            var id = parent.Id;

            for (var i = 0; i < depth; i++)
            {
                var child = new Prompt {
                    IsDraft = true, Owner = owner, ParentId = id
                };
                DbContext.Prompts.Add(child);
                await DbContext.SaveChangesAsync();

                id = child.Id;
            }

            var query = new GetPromptQuery(id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.NotNull(result);
        }
        public async Task Handle_ReturnsPromptWithParentIdSet_WhenPromptHasAParent()
        {
            //arrange
            var owner = new User {
                Username = "******"
            };
            var parent = new Prompt {
                Title = "Parent", IsDraft = false, Owner = owner
            };

            DbContext.Prompts.Add(parent);
            var child = new Prompt {
                IsDraft = true, Owner = owner, Parent = parent
            };

            DbContext.Prompts.Add(child);
            await DbContext.SaveChangesAsync();

            var query = new GetPromptQuery(child.Id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.NotNull(result);
            Assert.NotNull(result.ParentId);
            Assert.Equal(parent.Id, result.ParentId);
        }
        public async Task Handle_ReturnsAllChildPrompts(int childCount)
        {
            //arrange
            var expectedTitle = "Child";
            var owner         = new User {
                Username = "******"
            };
            var parent = new Prompt {
                Title = "Parent", IsDraft = false, Owner = owner
            };

            DbContext.Prompts.Add(parent);
            for (var i = 0; i < childCount; i++)
            {
                var child = new Prompt {
                    Title = expectedTitle, IsDraft = true, Owner = owner, Parent = parent
                };
                DbContext.Prompts.Add(child);
            }

            await DbContext.SaveChangesAsync();

            var query = new GetPromptQuery(parent.Id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.NotNull(result);
            Assert.Equal(childCount, result.Children.Count());
            Assert.All(result.Children, e => string.Equals(expectedTitle, e.Title));
        }
        public async Task Handle_ReturnsPrompt_IfPromptIsDraft_AndUserServiceReturnsUserWithCorrectId()
        {
            //arrange
            var owner = new User {
                Username = "******"
            };
            var prompt = new Prompt {
                IsDraft = true, Owner = owner
            };

            DbContext.Prompts.Add(prompt);
            await DbContext.SaveChangesAsync();

            var user = new GetUserViewModel {
                Id = owner.Id
            };

            _mockUserService.Setup(e => e.TryGetCurrentUser(out user)).Returns(true);
            var query = new GetPromptQuery(prompt.Id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.NotNull(result);
            Assert.True(result.IsDraft);
        }
        public async Task Handle_ReturnsNull_WhenTheDatabaseIsEmpty(int id)
        {
            //arrange
            var query = new GetPromptQuery(id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.Null(result);
        }
        public async Task Handle_ReturnsNull_WhenTheNoEntryWithTheGivenIdExists(int id)
        {
            //arrange
            var query = new GetPromptQuery(id);

            DbContext.Prompts.AddRange(new Prompt(), new Prompt(), new Prompt());
            await DbContext.SaveChangesAsync();

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.Null(result);
        }
        public async Task Handle_ReturnsNull_WhenTopLevelParentIsDraft_AndUserServiceReturnsUserWithWrongId(int depth)
        {
            //arrange
            var owner = new User {
                Username = "******"
            };
            var newUser = new User {
                Username = "******"
            };

            DbContext.Users.Add(newUser);

            var parent = new Prompt {
                IsDraft = true, Owner = owner
            };

            DbContext.Prompts.Add(parent);
            await DbContext.SaveChangesAsync();

            var id = parent.Id;

            for (var i = 0; i < depth; i++)
            {
                var child = new Prompt {
                    IsDraft = false, Owner = owner, ParentId = id
                };
                DbContext.Prompts.Add(child);
                await DbContext.SaveChangesAsync();

                id = child.Id;
            }

            var user = new GetUserViewModel {
                Id = newUser.Id
            };

            _mockUserService.Setup(e => e.TryGetCurrentUser(out user)).Returns(true);
            var query = new GetPromptQuery(id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.Null(result);
        }
        public async Task Handle_ReturnsNull_IfPromptIsDraft_AndUserServiceDoesNotReturnUser()
        {
            //arrange
            var prompt = new Prompt {
                IsDraft = true
            };

            DbContext.Prompts.Add(prompt);
            await DbContext.SaveChangesAsync();

            GetUserViewModel?user = null;

            _mockUserService.Setup(e => e.TryGetCurrentUser(out user)).Returns(false);
            var query = new GetPromptQuery(prompt.Id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.Null(result);
        }
        public async Task Handle_ReturnsHasScriptFileTrue_WhenPromptHasAnAssociatedScript()
        {
            //arrange
            var owner = new User {
                Username = "******"
            };
            var prompt = new Prompt {
                Owner = owner, ScriptZip = new byte[] { }
            };

            DbContext.Prompts.Add(prompt);
            await DbContext.SaveChangesAsync();

            var query = new GetPromptQuery(prompt.Id);

            //act
            GetPromptViewModel?result = await _handler.Handle(query);

            //assert
            Assert.NotNull(result);
            Assert.True(result.HasScriptFile);
        }