public async void Play_song_request__find_requested_song__found_multiple()
        {
            // Arrange
            IEnumerable <SongModel.Song> foundDynamodbSongs = new List <SongModel.Song> {
                SongFixtures.Song1,
                SongFixtures.Song2,
                SongFixtures.Song3
            };
            Mock <ICommonDependencyProvider> provider = new Mock <ICommonDependencyProvider>(MockBehavior.Strict);
            Mock <IAmazonSQS> sqsClient = new Mock <IAmazonSQS>(MockBehavior.Strict);
            Mock <IDynamodbDependencyProvider> dynamodbProvider = new Mock <IDynamodbDependencyProvider>(MockBehavior.Strict);

            dynamodbProvider.Setup(x => x.DynamoDbFindSongsByNumberAsync("328")).Returns(Task.FromResult(foundDynamodbSongs));
            var playSongRequest = new PlaySongNumberRequest(provider.Object, sqsClient.Object, "http://foo-bar", dynamodbProvider.Object);

            playSongRequest.SongRequested = SongFixtures.Song1;


            // Act
            await playSongRequest.FindRequestedSong();

            // Assert
            Assert.Equal("I Will Wait", playSongRequest.FoundSongs.ToList().FirstOrDefault().Title);
            Assert.Equal("Mumford & Sons", playSongRequest.FoundSongs.ToList().FirstOrDefault().Artist);
            Assert.Equal("328", playSongRequest.FoundSongs.ToList().FirstOrDefault().SongNumber);
        }
        public async Task Play_song_request__handle_request()
        {
            // Arrange
            var customSkillRequest = new CustomSkillRequest {
                Intent = new Intent {
                    Name  = "PlaySongNumberRequest",
                    Slots = new Dictionary <string, Slot> {
                        {
                            "SongNumber", new Slot {
                                Name  = "SongNumber",
                                Value = "328"
                            }
                        }
                    }
                },
                DialogState = "STARTED",
                Type        = "PlaySongTitleArtistRequest"
            };

            // mock dependency provider common
            Mock <ICommonDependencyProvider> provider = new Mock <ICommonDependencyProvider>(MockBehavior.Strict);

            // mock dependency provider sqs
            var request = new JukeboxSqsRequest {
                Key         = "328",
                MessageBody = "foo-bar",
                RequestType = "PlaySongNumberRequest"
            };
            var sendMessageRequest = new SendMessageRequest {
                QueueUrl               = "http://foo-bar",
                MessageGroupId         = "bat-baz",
                MessageDeduplicationId = "foo-date",
                MessageBody            = JsonConvert.SerializeObject(request)
            };
            Mock <IAmazonSQS> sqsClient = new Mock <IAmazonSQS>(MockBehavior.Strict);

            sqsClient.Setup(x => x.SendMessageAsync(sendMessageRequest, new CancellationToken()));

            // mock dependency provider dynamodb
            IEnumerable <SongModel.Song> foundDynamodbSongs = new List <SongModel.Song> {
                SongFixtures.Song1
            };
            Mock <IDynamodbDependencyProvider> dynamodbProvider = new Mock <IDynamodbDependencyProvider>(MockBehavior.Strict);

            dynamodbProvider.Setup(x => x.DynamoDbFindSongsByNumberAsync("328")).Returns(Task.FromResult(foundDynamodbSongs));
            var playSongRequest = new PlaySongNumberRequest(provider.Object, sqsClient.Object, "http://foo-bar", dynamodbProvider.Object);

            // Act
            var response = await playSongRequest.HandleRequest(customSkillRequest);

            // Assert
            Assert.Contains("Sending song number 328", response.Message);
        }
        public void Play_song_request__generate_message__found_no_song()
        {
            // Arrange
            Mock <ICommonDependencyProvider>   provider         = new Mock <ICommonDependencyProvider>(MockBehavior.Strict);
            Mock <IDynamodbDependencyProvider> dynamodbProvider = new Mock <IDynamodbDependencyProvider>(MockBehavior.Strict);
            Mock <IAmazonSQS> sqsClient = new Mock <IAmazonSQS>(MockBehavior.Strict);
            var playSongRequest         = new PlaySongNumberRequest(provider.Object, sqsClient.Object, "http://foo-bar", dynamodbProvider.Object);

            playSongRequest.SongRequested = SongFixtures.Song1;
            playSongRequest.FoundSongs    = new List <SongModel.Song>();

            // Act
            var response = playSongRequest.GenerateMessage();

            // Assert
            Assert.Contains("No song found for 328", response);
        }
        public static void Play_song_request__is_valid_request__invalid()
        {
            // Arrange
            var tempSongFixtures = new SongFixtures();
            Mock <ICommonDependencyProvider>   provider         = new Mock <ICommonDependencyProvider>(MockBehavior.Strict);
            Mock <IDynamodbDependencyProvider> dynamodbProvider = new Mock <IDynamodbDependencyProvider>(MockBehavior.Strict);
            Mock <IAmazonSQS> sqsClient = new Mock <IAmazonSQS>(MockBehavior.Strict);
            var playSongRequest         = new PlaySongNumberRequest(provider.Object, sqsClient.Object, "http://foo-bar", dynamodbProvider.Object);

            playSongRequest.SongRequested            = tempSongFixtures.Song1;
            playSongRequest.SongRequested.Artist     = "";
            playSongRequest.SongRequested.SongNumber = "";

            // Act
            var response = playSongRequest.IsValidRequest();

            // Assert
            Assert.False(response);
        }
        public static void Play_song_request__get_song_info_requested__found_no_slots()
        {
            // Arrange
            Mock <ICommonDependencyProvider>   provider         = new Mock <ICommonDependencyProvider>(MockBehavior.Strict);
            Mock <IDynamodbDependencyProvider> dynamodbProvider = new Mock <IDynamodbDependencyProvider>(MockBehavior.Strict);
            Mock <IAmazonSQS> sqsClient = new Mock <IAmazonSQS>(MockBehavior.Strict);
            var playSongRequest         = new PlaySongNumberRequest(provider.Object, sqsClient.Object, "http://foo-bar", dynamodbProvider.Object);
            var intentSlots             = new Dictionary <string, Slot> {
                {
                    "Title", new Slot {
                        Name  = "Title",
                        Value = "I Will Wait"
                    }
                }
            };

            // Act
            playSongRequest.GetSongInfoRequested(intentSlots);

            // Assert
            Assert.Null(playSongRequest.SongRequested.Title);
            Assert.Null(playSongRequest.SongRequested.Artist);
            Assert.Null(playSongRequest.SongRequested.SongNumber);
        }