public void ResolverReturningIncorrectHtmlReturnsErrorMessage() { const string insertedContentName = "dummyCodename1"; var wrapperWithObject = GetContentItemObjectElement(insertedContentName); var inputHtml = $"A hyper-hybrid socialization & turbocharges adaptive {wrapperWithObject} frameworks by thinking outside of the box, while the support structures influence the mediators."; const string insertedContentItemValue = "dummyValue"; var processedContentItems = new Dictionary <string, object> { { insertedContentName, new DummyProcessedContentItem() { Value = insertedContentItemValue } } }; var contentItemResolver = new ResolverReturningIncorrectHtml(); var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, null); inlineContentItemsProcessor.RegisterTypeResolver(contentItemResolver); var result = inlineContentItemsProcessor.Process(inputHtml, processedContentItems); var expectedResults = "A hyper-hybrid socialization & turbocharges adaptive [Inline content item resolver provided an invalid HTML 5 fragment (1:3). Please check the output for a content item dummyCodename1 of type KenticoCloud.Delivery.Tests.ContentItemsInRichTextProcessorTests+DummyProcessedContentItem.] frameworks by thinking outside of the box, while the support structures influence the mediators."; Assert.Equal(expectedResults, result); }
public void NestedInlineContentItemIsProcessedByElementProcessor() { var insertedContentName = "dummyCodename1"; var wrapperWithObject = WrapElementWithDivs(GetContentItemObjectElement(insertedContentName)); var plainHtml = $"<p>Lorem ipsum etc..<a>asdf</a>..</p>"; var input = plainHtml + wrapperWithObject; const string insertedContentItemValue = "dummyValue"; var processedContentItems = new Dictionary <string, object> { { insertedContentName, new DummyProcessedContentItem() { Value = insertedContentItemValue } } }; var contentItemResolver = new ResolverReturningElement(); var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, null); inlineContentItemsProcessor.RegisterTypeResolver(contentItemResolver); var result = inlineContentItemsProcessor.Process(input, processedContentItems); var expectedElement = $"<span>{insertedContentItemValue}</span>"; Assert.Equal(plainHtml + WrapElementWithDivs(expectedElement), result); }
public void ResolverReturningMixedElementsAndTextIsProcessedCorrectly() { const string insertedContentName = "dummyCodename1"; var wrapperWithObject = GetContentItemObjectElement(insertedContentName); var inputHtml = $"A hyper-hybrid socialization & turbocharges adaptive {wrapperWithObject} frameworks by thinking outside of the box, while the support structures influence the mediators."; const string insertedContentItemValue = "dummyValue"; var processedContentItems = new Dictionary <string, object> { { insertedContentName, new DummyProcessedContentItem() { Value = insertedContentItemValue } } }; var contentItemResolver = new ResolverReturningTextAndElement(); var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, null); inlineContentItemsProcessor.RegisterTypeResolver(contentItemResolver); var result = inlineContentItemsProcessor.Process(inputHtml, processedContentItems); var expectedResults = $"A hyper-hybrid socialization & turbocharges adaptive Text text brackets ( < [ <span>{insertedContentItemValue}</span><div></div>& Some more text frameworks by thinking outside of the box, while the support structures influence the mediators."; Assert.Equal(expectedResults, result); }
public void ProcessedHtmlIsSameIfNoContentItemsAreIncluded() { var inputHtml = $"<p>Lorem ipsum etc..<a>asdf</a>..</p>"; var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, null); var processedContentItems = new Dictionary <string, object>(); var result = inlineContentItemsProcessor.Process(inputHtml, processedContentItems); Assert.Equal(inputHtml, result); }
public void ProcessorRemoveAllRemovesAllInlineContentItems() { const string insertedImage1CodeName = "image1"; const string insertedImage2CodeName = "image2"; const string insertedDummyItem1CodeName = "item1"; const string insertedDummyItem2CodeName = "item2"; const string insertedDummyItem3CodeName = "item3"; var insertedImage1 = WrapElementWithDivs(GetContentItemObjectElement(insertedImage1CodeName)); var insertedImage2 = GetContentItemObjectElement(insertedImage2CodeName); var insertedDummyItem1 = GetContentItemObjectElement(insertedDummyItem1CodeName); var insertedDummyItem2 = WrapElementWithDivs(GetContentItemObjectElement(insertedDummyItem2CodeName)); var insertedDummyItem3 = GetContentItemObjectElement(insertedDummyItem3CodeName); var htmlInput = $"Opting out of business line is not a choice. {insertedDummyItem2} A radical, unified, highly-curated and" + $" digitized realignment transfers a touchpoint. As a result, the attackers empower our well-planned" + $" brainstorming spaces. It's not about our evidence-based customer centricity. It's about brandings. {insertedImage1}" + $" The project leader swiftly enhances market practices in the core. In the same time, an elite, siloed," + $" breakthrough generates our value-added cross fertilization.\n" + $"Our pre-plan prioritizes the group.Our top-level, service - oriented, ingenuity leverages knowledge" + $" - based commitments.{insertedDummyItem3} The market thinker dramatically enforces our hands" + $" - on brainstorming spaces.Adaptability and skillset invigorate the game changers. {insertedDummyItem1}" + $" The thought leaders target a teamwork-oriented silo.\n" + $"A documented high quality enables our unique, outside -in and customer-centric tailwinds." + $"It's not about our targets. {insertedImage2} It's about infrastructures."; var expectedOutput = $"Opting out of business line is not a choice. {WrapElementWithDivs(string.Empty)} A radical, unified, highly-curated and" + $" digitized realignment transfers a touchpoint. As a result, the attackers empower our well-planned" + $" brainstorming spaces. It's not about our evidence-based customer centricity. It's about brandings. {WrapElementWithDivs(string.Empty)}" + $" The project leader swiftly enhances market practices in the core. In the same time, an elite, siloed," + $" breakthrough generates our value-added cross fertilization.\n" + $"Our pre-plan prioritizes the group.Our top-level, service - oriented, ingenuity leverages knowledge" + $" - based commitments. The market thinker dramatically enforces our hands" + $" - on brainstorming spaces.Adaptability and skillset invigorate the game changers. " + $" The thought leaders target a teamwork-oriented silo.\n" + $"A documented high quality enables our unique, outside -in and customer-centric tailwinds." + $"It's not about our targets. It's about infrastructures."; var processor = new InlineContentItemsProcessor(null, null); var result = processor.RemoveAll(htmlInput); Assert.Equal(expectedOutput, result); }
public void UnretrievedContentItemIsResolvedByUnretrievedProcessor() { const string insertedContentName = "dummyCodename1"; const string message = "Unretrieved item detected"; var insertedObject = GetContentItemObjectElement(insertedContentName); var wrapperWithObject = WrapElementWithDivs(insertedObject); var plainHtml = "<p>Lorem ipsum etc..<a>asdf</a>..</p>"; var input = plainHtml + wrapperWithObject; var processedContentItems = new Dictionary <string, object> { { insertedContentName, new UnretrievedContentItem() } }; var unresolvedContentItemResolver = new UnretrievedItemsMessageReturningResolver(message); var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, unresolvedContentItemResolver); var result = inlineContentItemsProcessor.Process(input, processedContentItems); Assert.Equal(plainHtml + $"<div>{message}</div>", result); }
public void NestedInlineContentItemIsProcessedByDummyProcessor() { var insertedContentName = "dummyCodename1"; string wrapperWithObject = WrapElementWithDivs(GetContentItemObjectElement(insertedContentName)); var plainHtml = $"<p>Lorem ipsum etc..<a>asdf</a>..</p>"; var input = plainHtml + wrapperWithObject; var processedContentItems = new Dictionary <string, object>() { { insertedContentName, new DummyProcessedContentItem() } }; var contentItemResolver = new DummyResolver(); var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, null); inlineContentItemsProcessor.RegisterTypeResolver(contentItemResolver); var result = inlineContentItemsProcessor.Process(input, processedContentItems); Assert.Equal(plainHtml + WrapElementWithDivs(string.Empty), result); Assert.Equal(1, contentItemResolver.callsForResolve); }
public void ContentItemWithoutResolverIsHandledByDefaultResolver() { const string insertedContentName = "dummyCodename1"; const string message = "Default handler"; var wrapperWithObject = WrapElementWithDivs(GetContentItemObjectElement(insertedContentName)); var plainHtml = "<p>Lorem ipsum etc..<a>asdf</a>..</p>"; var input = plainHtml + wrapperWithObject; var processedContentItems = new Dictionary <string, object> { { insertedContentName, new DummyProcessedContentItem() } }; var differentResolver = new MessageReturningResolver("this should not appear"); var defaultResolver = new MessageReturningResolver(message); var inlineContentItemsProcessor = new InlineContentItemsProcessor(defaultResolver, null); inlineContentItemsProcessor.RegisterTypeResolver(differentResolver); var result = inlineContentItemsProcessor.Process(input, processedContentItems); Assert.Equal(plainHtml + $"<div>{message}</div>", result); }
public void InlineContentItemsAreProcessedByDummyProcessor() { var insertedContentName1 = "dummyCodename1"; var insertedContentName2 = "dummyCodename2"; var insertedObject1 = GetContentItemObjectElement(insertedContentName1); var insertedObject2 = GetContentItemObjectElement(insertedContentName2); var plainHtml = $"<p>Lorem ipsum etc..<a>asdf</a>..</p>"; var input = insertedObject1 + plainHtml + insertedObject2; var contentItemResolver = new DummyResolver(); var inlineContentItemsProcessor = new InlineContentItemsProcessor(null, null); inlineContentItemsProcessor.RegisterTypeResolver(contentItemResolver); var processedContentItems = new Dictionary <string, object>() { { insertedContentName1, new DummyProcessedContentItem() }, { insertedContentName2, new DummyProcessedContentItem() } }; var result = inlineContentItemsProcessor.Process(input, processedContentItems); Assert.Equal(plainHtml, result); }
// In case item is referencing itself ( A refs A ) we'd like to go through second processing as if there were no inline content items, // this is same as in other cases, because as soon as we start processing item which is already being processed we remove inline content items. public void RetrievingContentModelWithItemInlineReferencingItselfDoesNotCycle() { var fakeDeliverClient = A.Fake <IDeliveryClient>(); var codeFirstTypeProvider = A.Fake <ICodeFirstTypeProvider>(); A.CallTo(() => codeFirstTypeProvider.GetType(A <string> ._)).Returns(typeof(ContentItemWithSingleRTE)); var processor = new InlineContentItemsProcessor(null, null); processor.RegisterTypeResolver(new RichTextInlineResolver()); var retriever = new CodeFirstModelProvider(fakeDeliverClient); retriever.TypeProvider = codeFirstTypeProvider; A.CallTo(() => fakeDeliverClient.InlineContentItemsProcessor).Returns(processor); var item = JToken.FromObject(rt3); var modularContent = JToken.FromObject(modularContentForItemReferencingItself); var result = retriever.GetContentItemModel <ContentItemWithSingleRTE>(item, modularContent); Assert.Equal("<span>RT</span><span>RT</span>", result.RT); Assert.IsType <ContentItemWithSingleRTE>(result); }
// During processing of inline content items, item which detects circular dependency ( A refs B, B refs A ) should resolve resolved item // as if there were no inline content items, which will prevent circular dependency public void RetrievingContentModelWithCircularDependencyDoesNotCycle() { var fakeDeliverClient = A.Fake <IDeliveryClient>(); var codeFirstTypeProvider = A.Fake <ICodeFirstTypeProvider>(); A.CallTo(() => codeFirstTypeProvider.GetType(A <string> ._)).Returns(typeof(ContentItemWithSingleRTE)); var processor = new InlineContentItemsProcessor(null, null); processor.RegisterTypeResolver(new RichTextInlineResolver()); var retriever = new CodeFirstModelProvider(fakeDeliverClient); retriever.TypeProvider = codeFirstTypeProvider; A.CallTo(() => fakeDeliverClient.InlineContentItemsProcessor).Returns(processor); var item = JToken.FromObject(rt1); var linkedItems = JToken.FromObject(linkedItemsForItemWithTwoReferencedContentItems); var result = retriever.GetContentItemModel <ContentItemWithSingleRTE>(item, linkedItems); Assert.Equal("<span>FirstRT</span><span>SecondRT</span><span>FirstRT</span>", result.RT); Assert.IsType <ContentItemWithSingleRTE>(result); }
public void DifferentContentTypesUnretrievedAndContentTypesWithoutResolverAreResolvedCorrectly() { const string insertedImage1CodeName = "image1"; const string insertedImage1Source = "www.images.com/image1.png"; const string insertedImage2CodeName = "image2"; const string insertedDummyItem1CodeName = "item1"; const string insertedDummyItem1Value = "Leadership!"; const string insertedDummyItem2CodeName = "item2"; const string insertedDummyItem3CodeName = "item3"; const string insertedDummyItem3Value = "Unity!"; const string unretrievedItemMessage = "Unretrieved item detected!"; const string defaultResolverMessage = "Type witout resolver detected!"; var insertedImage1 = WrapElementWithDivs(GetContentItemObjectElement(insertedImage1CodeName)); var insertedImage2 = GetContentItemObjectElement(insertedImage2CodeName); var insertedDummyItem1 = GetContentItemObjectElement(insertedDummyItem1CodeName); var insertedDummyItem2 = WrapElementWithDivs(GetContentItemObjectElement(insertedDummyItem2CodeName)); var insertedDummyItem3 = GetContentItemObjectElement(insertedDummyItem3CodeName); var htmlInput = $"Opting out of business line is not a choice. {insertedDummyItem2} A radical, unified, highly-curated and" + $" digitized realignment transfers a touchpoint. As a result, the attackers empower our well-planned" + $" brainstorming spaces. It's not about our evidence-based customer centricity. It's about brandings. {insertedImage1}" + $" The project leader swiftly enhances market practices in the core. In the same time, an elite, siloed," + $" breakthrough generates our value-added cross fertilization.\n" + $"Our pre-plan prioritizes the group.Our top-level, service - oriented, ingenuity leverages knowledge" + $" - based commitments.{insertedDummyItem3} The market thinker dramatically enforces our hands" + $" - on brainstorming spaces.Adaptability and skillset invigorate the game changers. {insertedDummyItem1}" + $" The thought leaders target a teamwork-oriented silo.\n" + $"A documented high quality enables our unique, outside -in and customer-centric tailwinds." + $"It's not about our targets. {insertedImage2} It's about infrastructures."; var expectedOutput = $"Opting out of business line is not a choice. <div>{unretrievedItemMessage}</div> A radical, unified, highly-curated and" + $" digitized realignment transfers a touchpoint. As a result, the attackers empower our well-planned" + $" brainstorming spaces. It's not about our evidence-based customer centricity. It's about brandings. <div>{defaultResolverMessage}</div>" + $" The project leader swiftly enhances market practices in the core. In the same time, an elite, siloed," + $" breakthrough generates our value-added cross fertilization.\n" + $"Our pre-plan prioritizes the group.Our top-level, service - oriented, ingenuity leverages knowledge" + $" - based commitments.<span>{insertedDummyItem3Value}</span> The market thinker dramatically enforces our hands" + $" - on brainstorming spaces.Adaptability and skillset invigorate the game changers. <span>{insertedDummyItem1Value}</span>" + $" The thought leaders target a teamwork-oriented silo.\n" + $"A documented high quality enables our unique, outside -in and customer-centric tailwinds." + $"It's not about our targets. {unretrievedItemMessage} It's about infrastructures."; var processedContentItems = new Dictionary <string, object> { { insertedImage1CodeName, new DummyImageContentItem() { Source = insertedImage1Source } }, { insertedImage2CodeName, new UnretrievedContentItem() }, { insertedDummyItem1CodeName, new DummyProcessedContentItem() { Value = insertedDummyItem1Value } }, { insertedDummyItem2CodeName, new UnretrievedContentItem() }, { insertedDummyItem3CodeName, new DummyProcessedContentItem() { Value = insertedDummyItem3Value } }, }; var unretrievedInlineContentItemsResolver = new UnretrievedItemsMessageReturningResolver(unretrievedItemMessage); var defaultResolver = new MessageReturningResolver(defaultResolverMessage); var inlineContentItemsProcessor = new InlineContentItemsProcessor(defaultResolver, unretrievedInlineContentItemsResolver); inlineContentItemsProcessor.RegisterTypeResolver(new ResolverReturningElement()); var result = inlineContentItemsProcessor.Process(htmlInput, processedContentItems); Assert.Equal(expectedOutput, result); }