public void ExternalLinksHarvester_WithValidParametersInConstructor_ShouldCorrectlyInitializeNewInstance()
        {
            // Arrange
            var contextWrapperMock      = new Mock <IXmlContextWrapper>();
            var serializerMock          = new Mock <IXmlTransformDeserializer>();
            var transformersFactoryMock = new Mock <IExternalLinksTransformersFactory>();

            // Act
            var harvester = new ExternalLinksHarvester(contextWrapperMock.Object, serializerMock.Object, transformersFactoryMock.Object);

            // Assert
            Assert.IsNotNull(harvester);

            var contextWrapperField = PrivateField.GetInstanceField(HarvesterType.BaseType, harvester, ContextWrapperFieldName);

            Assert.IsNotNull(contextWrapperField);
            Assert.IsInstanceOf <IXmlContextWrapper>(contextWrapperField);
            Assert.AreSame(contextWrapperMock.Object, contextWrapperField);

            var serializerField = PrivateField.GetInstanceField(HarvesterType, harvester, SerializerFieldName);

            Assert.IsNotNull(serializerField);
            Assert.IsInstanceOf <IXmlTransformDeserializer>(serializerField);
            Assert.AreSame(serializerMock.Object, serializerField);

            var transformersFactoryField = PrivateField.GetInstanceField(HarvesterType, harvester, TransformersFactoryFieldName);

            Assert.IsNotNull(transformersFactoryField);
            Assert.IsInstanceOf <IExternalLinksTransformersFactory>(transformersFactoryField);
            Assert.AreSame(transformersFactoryMock.Object, transformersFactoryField);
        }
        public void ExternalLinksHarvester_WithNullSerializerProviderInConstructor_ShouldThrowArgumentNullExceptionWithCorrectParamName()
        {
            // Arrange
            var contextWrapperMock      = new Mock <IXmlContextWrapper>();
            var transformersFactoryMock = new Mock <IExternalLinksTransformersFactory>();

            // Act + Assert
            var exception = Assert.Throws <ArgumentNullException>(() =>
            {
                var harvester = new ExternalLinksHarvester(contextWrapperMock.Object, null, transformersFactoryMock.Object);
            });

            Assert.AreEqual(SerializerFieldName, exception.ParamName);
        }
        public void ExternalLinksHarvester_WithSampleXmlFile_ShouldExtractCorrectlyExternalLinks()
        {
            // Arrange
            const int ExpectedNumberOfExternalLinks          = 10;
            const int ExpectedNumberOfExternalLinksOfTypeDoi = 9;

            var xmlFileName = $"{ConfigurationManager.AppSettings["SampleFiles"]}/article-with-external-links.xml";
            var document    = new XmlDocument
            {
                PreserveWhitespace = true
            };

            document.Load(xmlFileName);

            var contextWrapper = new XmlContextWrapper();

            var deserializer = new XmlDeserializer();
            var serializer   = new XmlTransformDeserializer(deserializer);

            var xslCache    = new XslTransformCache();
            var transformer = new XslTransformer(
                ConfigurationManager.AppSettings[AppSettingsKeys.ExternalLinksXslFileName],
                xslCache);
            var transformersFactoryMock = new Mock <IExternalLinksTransformersFactory>();

            transformersFactoryMock
            .Setup(f => f.GetExternalLinksTransformer())
            .Returns(transformer);

            var harvester = new ExternalLinksHarvester(contextWrapper, serializer, transformersFactoryMock.Object);

            // Act
            var externalLinks = harvester.Harvest(document.DocumentElement).Result?.ToList();

            // Assert
            Assert.IsNotNull(externalLinks);
            externalLinks.ForEach(i => Console.WriteLine("{0} | {1} | {2}", i.BaseAddress, i.Uri, i.Value));

            Assert.AreEqual(ExpectedNumberOfExternalLinks, externalLinks.Count);

            var doiExternalLinks = externalLinks.Where(i => i.BaseAddress.Contains("doi.org")).ToList();

            Assert.AreEqual(ExpectedNumberOfExternalLinksOfTypeDoi, doiExternalLinks.Count);
        }