public void AlbumDetailsAreCorrect()
        {
            //Arrange
            var albumSubset = _albums.Where(a => a["userId"].Value <int>() == 5).Take(2)
                              .Concat(_albums.Where(a => a["userId"].Value <int>() == 8).Take(2))
                              .ToList();

            //Act
            var result = new PlaceholderDatasetCombiner(albumSubset, _photos, _logger);

            //Assert
            var output = new Output();

            output.WrapLine("Input JSON:");
            output.WriteLine();
            foreach (var albumJson in albumSubset)
            {
                output.WrapLine(albumJson.ToString(Formatting.Indented));
            }

            output.WriteLine();
            output.WriteLine();

            output.WrapLine("Extracted Album Data:");
            output.WriteLine();
            output.FormatTable(result.Dataset.Select(album => new { album.Id, album.UserId, album.Title }));
            output.Report.Verify();
        }
        public void AllPhotosAreExtracted()
        {
            //Act
            var result = new PlaceholderDatasetCombiner(_albums, _photos, _logger);

            //Assert
            result.Dataset.SelectMany(a => a.Photos).Count().Should().Be(_photos.Count);
        }
        public void AllAlbumsAreExtracted()
        {
            //Act
            var result = new PlaceholderDatasetCombiner(_albums, _photos, _logger);

            //Assert
            result.Dataset.Count.Should().Be(_albums.Count);
        }
        public void InvalidDataIsLogged()
        {
            //Arrange
            var albumProperties = _albums.SelectMany(obj => obj.Properties().Select(p => p.Name)).Distinct().ToList();
            var photoProperties = _photos.SelectMany(obj => obj.Properties().Select(p => p.Name)).Distinct().ToList();

            var goodAlbum = _albums.Skip(albumProperties.Count).Take(1).ToList();

            JObject BreakJProperty(JObject jObj, string prop)
            {
                if (jObj[prop] is JValue valueToken)
                {
                    switch (valueToken.Type)
                    {
                    case JTokenType.String:
                        jObj[prop] = 1;
                        break;

                    case JTokenType.Uri:
                    case JTokenType.Integer:
                        jObj[prop] = "bad";
                        break;
                    }
                }
                return(jObj);
            };
            var brokenAlbums = _albums.Take(albumProperties.Count)
                               .Zip(albumProperties, BreakJProperty)
                               .Concat(goodAlbum)
                               .ToList();

            var goodAlbumId     = goodAlbum[0]["id"];
            var goodAlbumPhotos = _photos.Where(p => p["albumId"].Equals(goodAlbumId));
            var brokenPhotos    = goodAlbumPhotos.Take(photoProperties.Count)
                                  .Zip(photoProperties, BreakJProperty)
                                  .ToList();

            var fakeLog         = new FakeLog(l => true);
            var recordingLogger = new FakeLogger(fakeLog, "test");

            //Act
            var result = new PlaceholderDatasetCombiner(brokenAlbums, brokenPhotos, recordingLogger);

            //Assert
            fakeLog.Report.Verify();
        }
        public void PhotoDetailsAreCorrect()
        {
            //Arrange
            var photoSubset = _photos.Where(p => p["albumId"].Value <int>() == 10).Take(2)
                              .Concat(_photos.Where(p => p["albumId"].Value <int>() == 75).Take(2))
                              .ToList();

            //Act
            var result = new PlaceholderDatasetCombiner(_albums, photoSubset, _logger);

            //Assert
            var buffer = new OutputBuffer()
            {
                BufferWidth = 132
            };
            var output = new Output(buffer);

            output.WrapLine("Input JSON:");
            output.WriteLine();
            foreach (var albumJson in photoSubset)
            {
                output.WrapLine(albumJson.ToString(Formatting.Indented));
            }

            output.WriteLine();
            output.WriteLine();

            output.WrapLine("Extracted Photo Data:");
            output.WriteLine();
            var photoDetails = result.Dataset
                               .SelectMany(album => album.Photos
                                           .Select(p => new { AlbumId = album.Id, PhotoId = p.Id, p.Title, p.ThumbnailUri, p.Uri }));

            output.FormatTable(photoDetails);
            output.Report.Verify();
        }
        public void MissingDataIsLogged()
        {
            //Arrange
            var albumProperties = _albums.SelectMany(obj => obj.Properties().Select(p => p.Name)).Distinct().ToList();
            var photoProperties = _photos.SelectMany(obj => obj.Properties().Select(p => p.Name)).Distinct().ToList();

            var goodAlbum = _albums.Skip(albumProperties.Count).Take(1).ToList();

            var brokenAlbums = _albums.Take(albumProperties.Count)
                               .Zip(albumProperties, (jObj, prop) =>
            {
                jObj.Remove(prop);
                return(jObj);
            })
                               .Concat(goodAlbum)
                               .ToList();

            var goodAlbumId     = goodAlbum[0]["id"];
            var goodAlbumPhotos = _photos.Where(p => p["albumId"].Equals(goodAlbumId));
            var brokenPhotos    = goodAlbumPhotos.Take(photoProperties.Count)
                                  .Zip(photoProperties, (jObj, prop) =>
            {
                jObj.Remove(prop);
                return(jObj);
            })
                                  .ToList();

            var fakeLog         = new FakeLog(l => true);
            var recordingLogger = new FakeLogger(fakeLog, "test");

            //Act
            var result = new PlaceholderDatasetCombiner(brokenAlbums, brokenPhotos, recordingLogger);

            //Assert
            fakeLog.Report.Verify();
        }