From 18106df44f950c3a47a9a277962b830f67c19348 Mon Sep 17 00:00:00 2001 From: nandeesh-gajula <69522367+nandeesh-gajula@users.noreply.github.com> Date: Thu, 9 Sep 2021 15:39:24 +0530 Subject: [PATCH 01/83] Create CODEOWNERS --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..d81d223 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @contentstack/security-admin @contentstack/sdk-admin From 20cccd38bbd1d3d00ff19c1033c0a232e36d6551 Mon Sep 17 00:00:00 2001 From: Uttam Krishna Ukkoji Date: Tue, 22 Feb 2022 12:54:58 +0530 Subject: [PATCH 02/83] refactor: :lock: Removed secrets contents --- .gitignore | 3 +- .../Constants/Constants.cs | 99 ++++ .../Constants/JsonToHtmlConstants.cs | 66 +++ .../Contentstack.Utils.Tests.csproj | 32 ++ Contentstack.Utils.Tests/DefaultRenderTest.cs | 360 ++++++++++++++ Contentstack.Utils.Tests/GQLTest.cs | 290 +++++++++++ .../Helpers/NodeParser.cs | 31 ++ .../HtmlDocumentExtensionTest.cs | 261 ++++++++++ Contentstack.Utils.Tests/JsonToHtmlTest.cs | 463 ++++++++++++++++++ Contentstack.Utils.Tests/MetadataTest.cs | 161 ++++++ .../Mocks/CustomRenderOptionMock.cs | 70 +++ .../Mocks/DefaultRenderMock.cs | 21 + .../Mocks/EmbeddedModelMock.cs | 167 +++++++ .../Mocks/EntryEmbeded.json | 81 +++ Contentstack.Utils.Tests/Mocks/GQLModel.cs | 74 +++ .../UtilsArrayStringTest.cs | 141 ++++++ .../UtilsCustomRenderTest.cs | 141 ++++++ Contentstack.Utils.Tests/UtilsTest.cs | 141 ++++++ 18 files changed, 2601 insertions(+), 1 deletion(-) create mode 100644 Contentstack.Utils.Tests/Constants/Constants.cs create mode 100644 Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs create mode 100644 Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj create mode 100644 Contentstack.Utils.Tests/DefaultRenderTest.cs create mode 100644 Contentstack.Utils.Tests/GQLTest.cs create mode 100644 Contentstack.Utils.Tests/Helpers/NodeParser.cs create mode 100644 Contentstack.Utils.Tests/HtmlDocumentExtensionTest.cs create mode 100644 Contentstack.Utils.Tests/JsonToHtmlTest.cs create mode 100644 Contentstack.Utils.Tests/MetadataTest.cs create mode 100644 Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs create mode 100644 Contentstack.Utils.Tests/Mocks/DefaultRenderMock.cs create mode 100644 Contentstack.Utils.Tests/Mocks/EmbeddedModelMock.cs create mode 100644 Contentstack.Utils.Tests/Mocks/EntryEmbeded.json create mode 100644 Contentstack.Utils.Tests/Mocks/GQLModel.cs create mode 100644 Contentstack.Utils.Tests/UtilsArrayStringTest.cs create mode 100644 Contentstack.Utils.Tests/UtilsCustomRenderTest.cs create mode 100644 Contentstack.Utils.Tests/UtilsTest.cs diff --git a/.gitignore b/.gitignore index fe75f65..000500d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ packages/ *.nuspec *.trx */TestResults/ -*/app.config \ No newline at end of file +*/app.config +.dccache \ No newline at end of file diff --git a/Contentstack.Utils.Tests/Constants/Constants.cs b/Contentstack.Utils.Tests/Constants/Constants.cs new file mode 100644 index 0000000..83c9f21 --- /dev/null +++ b/Contentstack.Utils.Tests/Constants/Constants.cs @@ -0,0 +1,99 @@ +using System; +namespace Contentstack.Utils.Tests.Constants +{ + public static class Constants + { + public const string kBlankString = ""; + + public const string kNoHTML = "non html string"; + public const string kSimpleHTML = "

Hello

World"; + + public const string kUnexpectedClose = "" + +""; + public const string kNoChildNode = "
" + +"
"; + + public const string kAssetDisplay = "
" + + "\"{{object.title}}\"
"; + +public const string kEntryBlock = "
" ++"{{title}}" ++"
"; + +public const string kEntryInline = "
" ++"{{title}}" ++"
"; + + public const string kEntryLink = "
" ++"{{title}}" ++"
"; + + public const string kAssetEmbed = "
" ++ "

" ++"

" ++ "
"; + + public const string kEntryEmbed = "
" ++"

bkcsdcsdc

" ++"
" ++"

" ++"
"; + + public const string kAllEmbeddEntry = "


Sample LinkText inside RTE 

"; + + public const string kUnexpectedResult = "title " ++ ""; + + public const string kAssetDisplayCustomResult = "title

filename image:

"; + + + public const string kEntryBlockCustomResult = "
UID_01
"; + + public const string kEntryInlineCustomeResult = "UID_01"; + + public const string kEntryLinkCustomResult = " Please find link to: " ++"{{title}}" ++""; + + public const string kAssetdisplayCustomResult = "title

filename image:

" ++ "

" ++"

" ++"title

filename image:

"; + + + public const string kEntryBlockLinkCustomResult = "
UID_01
Please find link to: " ++"{{title}}" ++""; + + public const string kEntryBlockLinkInlineCustomResult = "
UID_01
Please find link to: " ++"{{title}}" ++" UID_01"; + + public const string kAllEmbedCustomeResult = "
UID_01
" ++" Please find link to: " ++"{{title}}" ++"" ++"UID_01"; + + public const string kContentblockRTEResult = "
Update this title" ++"
" ++"
" ++"Entry with embedded entry " ++"

"; + + public const string kContentblockRichTextResult = "
updated title" ++ "
" ++ "
" ++"

" ++ "svg-logo-text.png

svg-logo-text.png image:

"; + + public const string kAssetMetaGlobalPreset = "http://image.contenstack.com/crop_area.jpeg?height=712&width=864&orient=4&format=jpeg&quality=100"; + public const string kAssetBlankExtensionResult = "http://image.contenstack.com/crop_area.jpeg?height=712&width=864&orient=4&format=jpeg&quality=100"; + public const string kAssetMetadataBlank = "http://image.contenstack.com/crop_area.jpeg?height=712&width=864&orient=4&format=jpeg&quality=100"; + public const string kAssetPresets = "http://image.contenstack.com/crop_area.jpeg?height=712&width=864&orient=4&format=jpeg&quality=100"; + public const string kAssetMetaFilterPreset = "http://image.contenstack.com/crop_area.jpeg?height=712&width=864&format=jpeg&quality=100&brightness=52&contrast=15&saturation=-30&blur=16&sharpen=a9,r669,t207"; + public const string kAssetMetaLocalPreset = "http://image.contenstack.com/crop_area.jpeg?height=500&width=500&orient=2&format=jpeg&quality=100"; + public const string kAssetMetaWithCropPreset = "http://image.contenstack.com/crop_area.jpeg?height=569.6&width=569.6&orient=3&format=jpeg&quality=100"; + public const string kAssetMetaQueryParam = "http://image.contenstack.com/crop_area.jpeg?render=full&noval=&height=712&width=864&orient=4&format=jpeg&quality=100"; + } +} diff --git a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs new file mode 100644 index 0000000..e1a3451 --- /dev/null +++ b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs @@ -0,0 +1,66 @@ +namespace Contentstack.Utils.Tests.Constants +{ + public static class JsonToHtmlResultConstants + { + public const string kPlainTextHtml = "Aliquam sit amet libero dapibus, eleifend ligula at, varius justoLorem ipsumdolor sit ametconsectetur adipiscing elit.Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. "; + public const string kParagraphHtml = "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. Praesent a diam iaculis turpis rhoncus faucibus. Aliquam sed pulvinar sem.

"; + public const string kH1Html = "

Lorem ipsum dolor sit amet.

"; + public const string kH2Html = "

Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor.

"; + public const string kH3Html = "

Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.

"; + public const string kH4Html = "

MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra

"; + public const string kH5Html = "
Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.
"; + public const string kH6Html = "
Nunc porta diam vitae purus semper, ut consequat lorem vehicula.
"; + public const string kOrderListHtml = "
  1. Morbi in quam molestie, fermentum diam vitae, bibendum ipsum.
  2. Pellentesque mattis lacus in quam aliquam congue
  3. Integer feugiat leo dignissim, lobortis enim vitae, mollis lectus.
  4. Sed in ante lacinia, molestie metus eu, fringilla sapien.
"; + public const string kIUnorderListHtml = "
  • Sed quis metus sed mi hendrerit mollis vel et odio.
  • Integer vitae sem dignissim, elementum libero vel, fringilla massa.
  • Integer imperdiet arcu sit amet tortor faucibus aliquet.
  • Aenean scelerisque velit vitae dui vehicula, at congue massa sagittis.
"; + public const string kImgHtml = ""; + public const string kTableHtml = "

Header 1

Header 2

Body row 1 data 1

Body row 1 data 2

Body row 2 data 1

Body row 2 data 2

"; + public const string kBlockquoteHtml = "
Praesent eu ex sed nibh venenatis pretium.
"; + public const string kCodeHtml = "Code template."; + public const string kLinkInPHtml = "

LINK

"; + public const string kEmbedHtml = ""; + } + + public static class JsonToHtmlConstants + { + public const string kBlankDocument = "{ \"uid\":\"06e34a7a4e5d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[],\"type\":\"doc\"}"; + public const string kPlainTextJson = "{ \"uid\":\"06e34a7a4e5d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"text\":\"Aliquam sit amet libero dapibus, eleifend ligula at, varius justo\",\"bold\":true},{ \"text\":\"Lorem ipsum\",\"bold\":true,\"italic\":true},{ \"text\":\"dolor sit amet\",\"bold\":true,\"italic\":true,\"underline\":true},{ \"text\":\"consectetur adipiscing elit.\",\"bold\":true,\"italic\":true,\"underline\":true,\"strikethrough\":true},{ \"text\":\"Sed condimentum iaculis magna in vehicula. \",\"bold\":true,\"italic\":true,\"underline\":true,\"inlineCode\":true},{ \"text\":\" Vestibulum vitae convallis \",\"bold\":true,\"italic\":true,\"underline\":true,\"superscript\":true},{ \"text\":\" lacus. \",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}],\"type\":\"doc\"}"; + public const string kH1Json = "{ \"uid\":\"06e34a7a449d7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h1\",\"attrs\":{ },\"uid\":\"c2dfed70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Lorem ipsum dolor sit amet.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; + public const string kH2Json = "{ \"uid\":\"06e34a7a4e2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h2\",\"attrs\":{ },\"uid\":\"c2dfed9a7030c65e2e1\",\"children\":[{ \"text\":\"Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor. \",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; + public const string kH3Json = "{ \"uid\":\"06e34ad7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h3\",\"attrs\":{ },\"uid\":\"c2df42cfb70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; + public const string kH4Json = "{ \"uid\":\"06e34a7a4e54cd\", \"_version\":13, \"attrs\":{ \"style\":{ \"text-align\":\"center\" }, \"redactor-attributes\":{ } }, \"children\":[{\"type\":\"h4\",\"attrs\":{},\"uid\":\"c2dfed4d7030c65e2e1\",\"children\":[{\"text\":\"MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; + public const string kH5Json = "{ \"uid\": \"06e381190849dacd\", \"_version\": 13, \"attrs\": { }, \"children\": [ { \"type\": \"h5\", \"attrs\": {}, \"uid\": \"c2d672242cfb7045e2e1\", \"children\": [ { \"text\": \"Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.\", } ] } ], \"type\": \"doc\" }"; + public const string kH6Json = "{ \"uid\": \"06e34a71190849d7fcd\", \"_version\": 13, \"attrs\": { }, \"children\": [ { \"type\": \"h6\", \"attrs\": {}, \"uid\": \"c2dfa672242cfb7e2e1\", \"children\": [ { \"text\": \"Nunc porta diam vitae purus semper, ut consequat lorem vehicula.\", } ] } ], \"type\": \"doc\" }"; + public const string kOrderListJson = "{ \"uid\":\"06e35 48119084 9d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"2b5b4acbb3cfce02d3e\",\"type\":\"ol\",\"children\":[{\"type\":\"li\",\"attrs\":{\"style\":{\"text-align\":\"justify\"},\"redactor-attributes\":{ }},\"uid\":\"160bbd7430b98bd3d996\",\"children\":[{\"text\":\"Morbi in quam molestie, fermentum diam vitae, bibendum ipsum.\"}]},{ \"type\":\"li\",\"attrs\":{ \"style\":{ \"text-align\":\"justify\"},\"redactor-attributes\":{ } },\"uid\":\"a15f4d749bc2903d\",\"children\":[{ \"text\":\"Pellentesque mattis lacus in quam aliquam congue\"}]},{ \"type\":\"li\",\"attrs\":{ \"style\":{ \"text-align\":\"justify\"},\"redactor-attributes\":{ } },\"uid\":\"e54224bbcb6f9e8f1e43\",\"children\":[{ \"text\":\"Integer feugiat leo dignissim, lobortis enim vitae, mollis lectus.\"}]},{ \"type\":\"li\",\"attrs\":{ \"style\":{ \"text-align\":\"justify\"},\"redactor-attributes\":{ } },\"uid\":\"c0148bab9af758784\",\"children\":[{ \"text\":\"Sed in ante lacinia, molestie metus eu, fringilla sapien.\"}]}],\"id\":\"7f413d448a\",\"attrs\":{ }}],\"type\":\"doc\"}"; + public const string kUnorderListJson = "{ \"uid\":\"0e5481190849a\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"a3a2b443ebffc867b\",\"type\":\"ul\",\"children\":[{\"uid\":\"f67354d4eed64451922\",\"type\":\"li\",\"children\":[{\"text\":\"Sed quis metus sed mi hendrerit mollis vel et odio.\"}],\"attrs\":{ }},{ \"uid\":\"5 50cba5 bea92f23e36fd1\",\"type\":\"li\",\"children\":[{ \"text\":\"Integer vitae sem dignissim, elementum libero vel, fringilla massa.\"}],\"attrs\":{ } },{ \"uid\":\"0e5c9b4cd983e8fd543\",\"type\":\"li\",\"children\":[{ \"text\":\"Integer imperdiet arcu sit amet tortor faucibus aliquet.\"}],\"attrs\":{ } },{ \"uid\":\"6d9a43a3816bd83a9a\",\"type\":\"li\",\"children\":[{ \"text\":\"Aenean scelerisque velit vitae dui vehicula, at congue massa sagittis.\"}],\"attrs\":{ } }],\"id\":\"b083fa46ef899420ab19\",\"attrs\":{ }}],\"type\":\"doc\"}"; + public const string kImgJson = "{ \"uid\":\"06e34a7a4849d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"f3be74be3b64646e626\",\"type\":\"img\",\"attrs\":{\"url\":\"https://images.contentstack.com/v3/assets/UID_13/Donald.jog.png\",\"width\":33.69418132611637,\"height\":\"auto\",\"redactor-attributes\":{\"asset_uid\":\"47f1aa5ae422cd1\"}},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kParagraphJson = "{ \"uid\":\"0d7fd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"type\":\"p\",\"attrs\":{},\"uid\":\"0a1b5676aa510e5a\",\"children\":[{\"text\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. Praesent a diam iaculis turpis rhoncus faucibus. Aliquam sed pulvinar sem.\"}]}],\"type\":\"doc\"}"; + public const string kBlockquoteJson = "{ \"uid\":\"06084d7fd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"503f9cc97534db55\",\"type\":\"blockquote\",\"id\":\"431f78e567161460\",\"children\":[{\"text\":\"Praesent eu ex sed nibh venenatis pretium.\"}],\"attrs\":{ }}],\"type\":\"doc\"}"; + public const string kCodeJson = "{ \"uid\":\"06ea490849d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"83fba92c91b30002b\",\"type\":\"code\",\"attrs\":{},\"children\":[{\"text\":\"Code template.\"}]}],\"type\":\"doc\"}"; + public const string kTableJson = "{ \"uid\": \"06e481190849d7fcd\", \"_version\": 13, \"attrs\": { }, \"children\": [ { \"uid\": \"6dd64343bf634bfadd4\", \"type\": \"table\", \"attrs\": { \"rows\": 4, \"cols\": 2, \"colWidths\": [ 250, 250 ] }, \"children\": [ { \"uid\": \"b9082\", \"type\": \"thead\", \"attrs\": {}, \"children\": [ { \"type\": \"tr\", \"attrs\": {}, \"children\": [ { \"type\": \"th\", \"attrs\": {}, \"children\": [ { \"type\": \"p\", \"attrs\": {}, \"children\": [ { \"text\": \"Header 1\" } ], \"uid\": \"daa3ef\" } ], \"uid\": \"4b3124414a3\" }, { \"type\": \"th\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Header 2\" } ], \"uid\": \"eae83c5797d\" } ], \"uid\": \"bca9b6f037a04fb485\" } ], \"uid\": \"b91ae7a48ef2e9da1\" } ] }, { \"type\": \"tbody\", \"attrs\": { }, \"children\": [ { \"type\": \"tr\", \"attrs\": { }, \"children\": [ { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 1 data 1\" } ], \"uid\": \"ec674ccc5ce70b7cab\" } ], \"uid\": \"2a70bdeeb99a\" }, { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 1 data 2\" } ], \"uid\": \"769a 3f9db34 ce8ec 10486d50\" } ], \"uid\": \"d6407 34a5c6 1ab1e5f7d1\" } ], \"uid\": \"77f6 b951c68 7f9eb397c5\" }, { \"type\": \"tr\", \"attrs\": { }, \"children\": [ { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 2 data 1\" } ], \"uid\": \"a6bf 11bb48 630e87d721c0\" } ], \"uid\": \"3da39838b0feaf\" }, { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 2 data 2\" } ], \"uid\": \"3b7d12 1f694202 49029e86313\" } ], \"uid\": \"95b38b04abcbc25e94f\" } ], \"uid\": \"b 227fea 8d247013 4f1e1e8\" } ], \"uid\": \"fd5ab86aa642798451b\" } ] }, ], \"type\": \"doc\" }"; + public const string kLinkInPJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"type\":\"p\",\"attrs\":{\"style\":{\"text-align\":\"left\"},\"redactor-attributes\":{ }},\"uid\":\"d88dcdf4590dff2d\",\"children\":[{\"text\":\"\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true},{ \"uid\":\"0d06598201aa8b47\",\"type\":\"a\",\"attrs\":{ \"url\":\"LINK.com\",\"target\":\"_self\"},\"children\":[{ \"text\":\"LINK\"}]},{ \"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kEmbedJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"251017315905c35d42c9\",\"type\":\"embed\",\"attrs\":{\"url\":\"https://www.youtube.com/watch?v=AOP0yARiW8U\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kAssetReferenceJson = "{\"uid\":\"06e34a7 5e4 e549d \", \"_version\":1, \"attrs\":{}, \"children\":[{ \"uid\": \"4f7e33 3390a955 de10c1 c836\", \"type\":\"reference\",\"attrs\":{\"display-type\":\"display\",\"asset-uid\":\"UID_12\",\"content-type-uid\":\"sys_assets\",\"asset-link\":\"https://images.contentstack.com/v3/assets/UID_14/11.jpg\",\"asset-name\":\"11.jpg\",\"asset-type\":\"image/jpeg\",\"type\":\"asset\",\"class-name\":\"embedded-asset\",\"width\":25.16914749661705,\"className\":\"dsd\",\"id\":\"sdf\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kEntryReferenceBlockJson = "{ \"uid\":\"06e34a7 5e4 e549d \", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"70f9b 325075d43 128c0d0 aa3eb7f291f\",\"type\":\"reference\",\"attrs\":{\"display-type\":\"block\",\"entry-uid\":\"UID_07\",\"content-type-uid\":\"content_block\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kEntryReferenceLinkJson = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"7626ea98e0e95d602210\",\"type\":\"reference\",\"attrs\":{\"target\":\"_self\",\"href\":\"/copy-of-entry-final-02\",\"display-type\":\"link\",\"entry-uid\":\"UID_08\",\"content-type-uid\":\"embeddedrte\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"/copy-of-entry-final-02\"}]}],\"type\":\"doc\"}"; + public const string kEntryReferenceInlineJson = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"506 4878f3f46 s21f0cbc aff\",\"type\":\"reference\",\"attrs\":{\"display-type\":\"inline\",\"entry-uid\":\"UID_09\",\"content-type-uid\":\"embeddedrte\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kHRJson = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"f5a7b57 40a8a5c3 576828276b\",\"type\":\"hr\",\"children\":[{\"text\":\"\"}],\"attrs\":{ }}],\"type\":\"doc\"}"; + + + public const string KAssetNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"system\": { \"content_type_uid\": \"sys_assets\", \"uid\": \"UID_12\" }, \"created_at\": \"2020-08-19T09:13:32.785Z\", \"updated_at\": \"2020-08-19T09:13:32.785Z\", \"created_by\": \"Created_at\", \"updated_by\": \"Created_at\", \"content_type\": \"application/pdf\", \"file_size\": \"13264\", \"filename\": \"dummy.pdf\", \"url\":\"/v3/assetsUID_12/dummy.pdf\", \"_version\": 1, \"title\": \"dummy.pdf\" } } ]}"; + public const string KEntryBlocNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"title\": \"Update this title\", \"url\": \"\", \"locale\": \"en-us\", \"system\": { \"uid\": \"UID_07\", \"content_type_uid\": \"content_block\" }, \"_version\": 5, \"_in_progress\": false, \"multi_line\": \"\", \"rich_text_editor\": \"\" } } ]}"; + public const string KEntryLinkNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"title\": \"Entry with embedded entry\", \"rich_text_editor\": [ \"\" ], \"locale\": \"en-us\", \"system\": { \"uid\": \"UID_08\", \"content_type_uid\": \"embeddedrte\" }, \"_in_progress\": false } } ]}"; + public const string KEntryInlineNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"title\": \"updated title\", \"rich_text_editor\": [ \"\" ], \"locale\": \"en-us\", \"system\": { \"uid\": \"UID_09\", \"content_type_uid\": \"embeddedrte\", }, \"_in_progress\": false } } ]}"; + public static string KGQLModel(string node, string embedConnection = null) + { + return $"{{\"multiplerte\":{{\"json\":[{node}]{(embedConnection != null ? ","+embedConnection : "")} }}, \"singlerte\":{{\"json\":{node}{(embedConnection != null ? "," + embedConnection : "")}}} }}"; + } + + public const string kAssetMeta = "{\"uid\":\"asset_uid\",\"created_by\":\"create_by\",\"updated_by\":\"update_by\",\"content_type\":\"image/jpeg\",\"file_size\":\"62181\",\"tags\":[],\"filename\":\"crop_area.jpeg\",\"url\":\"http://image.contenstack.com/crop_area.jpeg\",\"is_dir\":false,\"parent_uid\":null,\"path\":[],\"_version\":1,\"title\":\"crop_area.jpeg\",\"dimension\":{\"height\":712,\"width\":864},\"_metadata\":{\"extensions\":{\"extension_uid\":{\"local_metadata\":{\"local_data\":\"main\",\"presets\":[{\"uid\":\"preset_01\",\"name\":\"Local Preset\",\"options\":{\"transform\":{\"height\":500,\"width\":500,\"flip-mode\":\"horiz\",\"rotate\":40},\"focal-point\":{\"x\":-0.668935003427432,\"y\":-0.9220385351936531},\"quality\":\"100\",\"image-type\":\"jpeg\"}},{\"uid\":\"preset_02\",\"name\":\"WithCrop\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":\"569.6\",\"width\":\"569.6\",\"flip-mode\":\"both\"},\"image-type\":\"jpeg\",\"crop\":{\"height\":\"569.6\",\"width\":\"569.6\",\"x\":\"147.2\",\"y\":\"71.2\"}}},{\"uid\":\"preset_03\",\"name\":\"Filter\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":712,\"width\":864},\"image-type\":\"jpeg\",\"effects\":{\"brightness\":52,\"contrast\":15,\"saturate\":-30,\"blur\":16,\"sharpen\":{\"amount\":9,\"radius\":669,\"threshold\":207}}}}]},\"global_metadata\":{\"presets\":[{\"uid\":\"preset_04\",\"name\":\"Global Preset\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":\"712\",\"width\":\"864\",\"flip-mode\":\"verti\"},\"image-type\":\"jpeg\"}}]}}}}}"; + public const string kAssetBlankExtension = "{\"uid\":\"asset_uid\",\"created_by\":\"create_by\",\"updated_by\":\"update_by\",\"content_type\":\"image/jpeg\",\"file_size\":\"62181\",\"tags\":[],\"filename\":\"crop_area.jpeg\",\"url\":\"http://image.contenstack.com/crop_area.jpeg\",\"is_dir\":false,\"parent_uid\":null,\"path\":[],\"_version\":1,\"title\":\"crop_area.jpeg\",\"dimension\":{\"height\":712,\"width\":864},\"_metadata\":{\"extensions\":{\"extension_uid\":{}}}}"; + public const string kAssetMetadataBlank = "{\"uid\":\"asset_uid\",\"created_by\":\"create_by\",\"updated_by\":\"update_by\",\"content_type\":\"image/jpeg\",\"file_size\":\"62181\",\"tags\":[],\"filename\":\"crop_area.jpeg\",\"url\":\"http://image.contenstack.com/crop_area.jpeg\",\"is_dir\":false,\"parent_uid\":null,\"path\":[],\"_version\":1,\"title\":\"crop_area.jpeg\",\"dimension\":{\"height\":712,\"width\":864},\"_metadata\":{\"extensions\":{\"extension_uid\":{\"local_metadata\":{\"local_data\":\"main\",},\"global_metadata\":{}}}}}"; + public const string kAssetPresets = "{\"uid\":\"asset_uid\",\"created_by\":\"create_by\",\"updated_by\":\"update_by\",\"content_type\":\"image/jpeg\",\"file_size\":\"62181\",\"tags\":[],\"filename\":\"crop_area.jpeg\",\"url\":\"http://image.contenstack.com/crop_area.jpeg\",\"is_dir\":false,\"parent_uid\":null,\"path\":[],\"_version\":1,\"title\":\"crop_area.jpeg\",\"dimension\":{\"height\":712,\"width\":864},\"_metadata\":{\"extensions\":{\"extension_uid\":{\"local_metadata\":{\"local_data\":\"main\",\"presets\":[{\"uid\":\"preset_01\",\"name\":\"Local Preset\",\"options\":{}},{\"uid\":\"preset_02\",\"name\":\"WithCrop\",\"options\":{\"quality\":\"100\",\"transform\":{},\"image-type\":\"jpeg\",\"crop\":{}}},{\"uid\":\"preset_03\",\"name\":\"Filter\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":712,\"width\":864},\"image-type\":\"jpeg\",\"effects\":{}}}]},\"global_metadata\":{\"presets\":[{\"uid\":\"preset_04\",\"name\":\"Global Preset\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":\"712\",\"width\":\"864\",\"flip-mode\":\"verti\"},\"image-type\":\"jpeg\"}}]}}}}}"; + public const string kAsset = "{\"uid\":\"asset_uid\",\"created_by\":\"create_by\",\"updated_by\":\"update_by\",\"content_type\":\"image/jpeg\",\"file_size\":\"62181\",\"tags\":[],\"filename\":\"crop_area.jpeg\",\"url\":\"http://image.contenstack.com/crop_area.jpeg\",\"is_dir\":false,\"parent_uid\":null,\"path\":[],\"_version\":1,\"title\":\"crop_area.jpeg\",\"dimension\":{\"height\":712,\"width\":864},\"_metadata\":{}}"; + public const string kAssetMetaURLQuery = "{\"uid\":\"asset_uid\",\"created_by\":\"create_by\",\"updated_by\":\"update_by\",\"content_type\":\"image/jpeg\",\"file_size\":\"62181\",\"tags\":[],\"filename\":\"crop_area.jpeg\",\"url\":\"http://image.contenstack.com/crop_area.jpeg?render=full&noval\",\"is_dir\":false,\"parent_uid\":null,\"path\":[],\"_version\":1,\"title\":\"crop_area.jpeg\",\"dimension\":{\"height\":712,\"width\":864},\"_metadata\":{\"extensions\":{\"extension_uid\":{\"local_metadata\":{\"local_data\":\"main\",\"presets\":[{\"uid\":\"preset_01\",\"name\":\"Local Preset\",\"options\":{\"transform\":{\"height\":500,\"width\":500,\"flip-mode\":\"horiz\",\"rotate\":40},\"focal-point\":{\"x\":-0.668935003427432,\"y\":-0.9220385351936531},\"quality\":\"100\",\"image-type\":\"jpeg\"}},{\"uid\":\"preset_02\",\"name\":\"WithCrop\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":\"569.6\",\"width\":\"569.6\",\"flip-mode\":\"both\"},\"image-type\":\"jpeg\",\"crop\":{\"height\":\"569.6\",\"width\":\"569.6\",\"x\":\"147.2\",\"y\":\"71.2\"}}},{\"uid\":\"preset_03\",\"name\":\"Filter\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":712,\"width\":864},\"image-type\":\"jpeg\",\"effects\":{\"brightness\":52,\"contrast\":15,\"saturate\":-30,\"blur\":16,\"sharpen\":{\"amount\":9,\"radius\":669,\"threshold\":207}}}}]},\"global_metadata\":{\"presets\":[{\"uid\":\"preset_04\",\"name\":\"Global Preset\",\"options\":{\"quality\":\"100\",\"transform\":{\"height\":\"712\",\"width\":\"864\",\"flip-mode\":\"verti\"},\"image-type\":\"jpeg\"}}]}}}}}"; + + } +} diff --git a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj new file mode 100644 index 0000000..8c4cf96 --- /dev/null +++ b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj @@ -0,0 +1,32 @@ + + + + netcoreapp3.1 + + false + 1.0.1 + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + diff --git a/Contentstack.Utils.Tests/DefaultRenderTest.cs b/Contentstack.Utils.Tests/DefaultRenderTest.cs new file mode 100644 index 0000000..1751fc8 --- /dev/null +++ b/Contentstack.Utils.Tests/DefaultRenderTest.cs @@ -0,0 +1,360 @@ +using Contentstack.Utils.Models; +using Xunit; +using Contentstack.Utils.Tests.Mocks; +using Contentstack.Utils.Enums; +using Contentstack.Utils.Tests.Helpers; +using Contentstack.Utils.Tests.Constants; +using System; + +namespace Contentstack.Utils.Tests +{ + public class DefaultRenderTest + { + Options defaultRender = new Options(new EmbeddedModel("")); + Embedded embedded = new Embedded { Uid = "uid" }; + EmbeddedContentTypeUidModel embeddedContentType = new EmbeddedContentTypeUidModel(); + EmbeddedAssetModel embeddedAsset = new EmbeddedAssetModel(); + EmbeddedEntryModel embeddedEntryModel = new EmbeddedEntryModel(); + + Node node = NodeParser.parse(JsonToHtmlConstants.kBlankDocument); + + string text = "Text To set Link"; + + Metadata getMetadata(EmbedItemType embedItemType = EmbedItemType.Entry, + StyleType styleType = StyleType.Block, + string text = null) + { + return new Metadata { ItemType = embedItemType, StyleType = styleType, ItemUid = "", ContentTypeUid = "", Text = text }; + } + + [Fact] + public void testEmbedded() + { + string blockString = defaultRender.RenderOption(embedded, getMetadata()); + Assert.Equal(embedded.renderString(StyleType.Block), blockString); + + string inlineString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Inline)); + Assert.Equal(embedded.renderString(StyleType.Inline), inlineString); + + string linkString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Link)); + Assert.Equal(embedded.renderString(StyleType.Link), linkString); + + string displayString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Display)); + Assert.Equal(embedded.renderString(StyleType.Display), displayString); + + string downloadString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Download)); + Assert.Equal(embedded.renderString(StyleType.Download), downloadString); + + } + + [Fact] + public void testEmbeddedWithText() + { + string blockString = defaultRender.RenderOption(embedded, getMetadata(text: text)); + Assert.Equal(embedded.renderString(StyleType.Block, text), blockString); + + string inlineString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Inline, text: text)); + Assert.Equal(embedded.renderString(StyleType.Inline, text), inlineString); + + string linkString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Link, text: text)); + Assert.Equal(embedded.renderString(StyleType.Link, text), linkString); + + string displayString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Display, text: text)); + Assert.Equal(embedded.renderString(StyleType.Display, text), displayString); + + string downloadString = defaultRender.RenderOption(embedded, getMetadata(styleType: StyleType.Download, text: text)); + Assert.Equal(embedded.renderString(StyleType.Download, text), downloadString); + + } + + [Fact] + public void testEmbeddedContentTypeEntry() + { + string blockString = defaultRender.RenderOption(embeddedContentType, getMetadata()); + Assert.Equal(embeddedContentType.renderString(StyleType.Block), blockString); + + string inlineString = defaultRender.RenderOption(embeddedContentType, getMetadata(styleType: StyleType.Inline)); + Assert.Equal(embeddedContentType.renderString(StyleType.Inline), inlineString); + + string linkString = defaultRender.RenderOption(embeddedContentType, getMetadata(styleType: StyleType.Link)); + Assert.Equal(embeddedContentType.renderString(StyleType.Link), linkString); + + } + + [Fact] + public void testEmbeddedContentTypeEntryWithText() + { + string blockString = defaultRender.RenderOption(embeddedContentType, getMetadata(text: text)); + Assert.Equal(embeddedContentType.renderString(StyleType.Block, text), blockString); + + string inlineString = defaultRender.RenderOption(embeddedContentType, getMetadata(styleType: StyleType.Inline, text: text)); + Assert.Equal(embeddedContentType.renderString(StyleType.Inline, text), inlineString); + + string linkString = defaultRender.RenderOption(embeddedContentType, getMetadata(styleType: StyleType.Link, text: text)); + Assert.Equal(embeddedContentType.renderString(StyleType.Link, text), linkString); + + } + + [Fact] + public void testEmbeddedEntry() + { + string blockString = defaultRender.RenderOption(embeddedEntryModel, getMetadata()); + Assert.Equal(embeddedEntryModel.renderString(StyleType.Block), blockString); + + string inlineString = defaultRender.RenderOption(embeddedEntryModel, getMetadata(styleType: StyleType.Inline)); + Assert.Equal(embeddedEntryModel.renderString(StyleType.Inline), inlineString); + + string linkString = defaultRender.RenderOption(embeddedEntryModel, getMetadata(styleType: StyleType.Link)); + Assert.Equal(embeddedEntryModel.renderString(StyleType.Link), linkString); + + } + + [Fact] + public void testEmbeddedEntryWithText() + { + string blockString = defaultRender.RenderOption(embeddedEntryModel, getMetadata(text: text)); + Assert.Equal(embeddedEntryModel.renderString(StyleType.Block, text), blockString); + + string inlineString = defaultRender.RenderOption(embeddedEntryModel, getMetadata(styleType: StyleType.Inline, text: text)); + Assert.Equal(embeddedEntryModel.renderString(StyleType.Inline, text), inlineString); + + string linkString = defaultRender.RenderOption(embeddedEntryModel, getMetadata(styleType: StyleType.Link, text: text)); + Assert.Equal(embeddedEntryModel.renderString(StyleType.Link, text), linkString); + + } + + + [Fact] + public void testEmbeddedAsset() + { + string displayString = defaultRender.RenderOption(embeddedAsset, getMetadata(styleType: StyleType.Display)); + Assert.Equal(embeddedAsset.renderString(StyleType.Display), displayString); + + string downloadString = defaultRender.RenderOption(embeddedAsset, getMetadata(styleType: StyleType.Download)); + Assert.Equal(embeddedAsset.renderString(StyleType.Download), downloadString); + } + + [Fact] + public void testEmbeddedAssetWithText() + { + string displayString = defaultRender.RenderOption(embeddedAsset, getMetadata(styleType: StyleType.Display, text: text)); + Assert.Equal(embeddedAsset.renderString(StyleType.Display, text), displayString); + + string downloadString = defaultRender.RenderOption(embeddedAsset, getMetadata(styleType: StyleType.Download, text: text)); + Assert.Equal(embeddedAsset.renderString(StyleType.Download, text), downloadString); + } + + [Fact] + public void testRenderMark() + { + string boldString = defaultRender.RenderMark(MarkType.Bold, text); + Assert.Equal(""+text+"", boldString); + string italicString = defaultRender.RenderMark(MarkType.Italic, text: text); + Assert.Equal(""+text+"", italicString); + string underlineString = defaultRender.RenderMark(MarkType.Underline, text: text); + Assert.Equal(""+text+"", underlineString); + string strickthroughString = defaultRender.RenderMark(MarkType.Strikethrough, text: text); + Assert.Equal(""+text+"", strickthroughString); + string inlineCodeString = defaultRender.RenderMark(MarkType.InlineCode, text: text); + Assert.Equal(""+text+"", inlineCodeString); + string subscriptString = defaultRender.RenderMark(MarkType.Subscript, text: text); + Assert.Equal(""+text+"", subscriptString); + string superscriptString = defaultRender.RenderMark(MarkType.Superscript, text: text); + Assert.Equal(""+text+"", superscriptString); + } + + [Fact] + public void testParagraphDocument () + { + string result = defaultRender.RenderNode("p", node, (nodes) => { return text; }); + + Assert.Equal($"

{text}

", result); + } + + [Fact] + public void testLinkhDocument() + { + Node nodeLink = NodeParser.parse(JsonToHtmlConstants.kLinkInPJson).children[0].children[1]; + + string result = defaultRender.RenderNode("a", nodeLink, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testImageDocument() + { + string result = defaultRender.RenderNode("img", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testEmbedDocument() + { + string result = defaultRender.RenderNode("embed", node, (nodes) => { return text; }); + + Assert.Equal($"", result); + } + + [Fact] + public void testH1Document() + { + string result = defaultRender.RenderNode("h1", node, (nodes) => { return text; }); + + Assert.Equal($"

{text}

", result); + } + + [Fact] + public void testH2Document() + { + string result = defaultRender.RenderNode("h2", node, (nodes) => { return text; }); + + Assert.Equal($"

{text}

", result); + } + + [Fact] + public void testH3Document() + { + string result = defaultRender.RenderNode("h3", node, (nodes) => { return text; }); + + Assert.Equal($"

{text}

", result); + } + + [Fact] + public void testH4Document() + { + string result = defaultRender.RenderNode("h4", node, (nodes) => { return text; }); + + Assert.Equal($"

{text}

", result); + } + + [Fact] + public void testH5Document() + { + string result = defaultRender.RenderNode("h5", node, (nodes) => { return text; }); + + Assert.Equal($"
{text}
", result); + } + + [Fact] + public void testH6Document() + { + string result = defaultRender.RenderNode("h6", node, (nodes) => { return text; }); + + Assert.Equal($"
{text}
", result); + } + + [Fact] + public void testOrderListDocument() + { + string result = defaultRender.RenderNode("ol", node, (nodes) => { return text; }); + + Assert.Equal($"
    {text}
", result); + } + + [Fact] + public void testUnOrderListDocument() + { + string result = defaultRender.RenderNode("ul", node, (nodes) => { return text; }); + + Assert.Equal($"
    {text}
", result); + } + + [Fact] + public void testListItemDocument() + { + string result = defaultRender.RenderNode("li", node, (nodes) => { return text; }); + + Assert.Equal($"
  • {text}
  • ", result); + } + + [Fact] + public void testHRDocument() + { + string result = defaultRender.RenderNode("hr", node, (nodes) => { return text; }); + + Assert.Equal($"
    ", result); + } + + [Fact] + public void testTableDocument() + { + string result = defaultRender.RenderNode("table", node, (nodes) => { return text; }); + + Assert.Equal($"{text}
    ", result); + } + + [Fact] + public void testTableHeaderDocument() + { + string result = defaultRender.RenderNode("thead", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testTableFooterDocument() + { + string result = defaultRender.RenderNode("tfoot", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testTableBodyDocument() + { + string result = defaultRender.RenderNode("tbody", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testTableRowDocument() + { + string result = defaultRender.RenderNode("tr", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testTableHeadDocument() + { + string result = defaultRender.RenderNode("th", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testTableDataDocument() + { + string result = defaultRender.RenderNode("td", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testBlockQuoteDocument() + { + string result = defaultRender.RenderNode("blockquote", node, (nodes) => { return text; }); + + Assert.Equal($"
    {text}
    ", result); + } + + [Fact] + public void testCodeDocument() + { + string result = defaultRender.RenderNode("code", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + + [Fact] + public void testDocument() + { + string result = defaultRender.RenderNode("doc", node, (nodes) => { return text; }); + + Assert.Equal(text, result); + } + } +} \ No newline at end of file diff --git a/Contentstack.Utils.Tests/GQLTest.cs b/Contentstack.Utils.Tests/GQLTest.cs new file mode 100644 index 0000000..d4b0f9c --- /dev/null +++ b/Contentstack.Utils.Tests/GQLTest.cs @@ -0,0 +1,290 @@ +using System; +using System.Collections.Generic; +using Contentstack.Utils.Tests.Constants; +using Contentstack.Utils.Tests.Helpers; +using Contentstack.Utils.Tests.Mocks; +using Xunit; +using static Contentstack.Utils.Utils; + +namespace Contentstack.Utils.Tests +{ + public class GQLTest + { + DefaultRenderMock defaultRender = new DefaultRenderMock(null); + + [Fact] + public void Should_Return_Empty_String_For_EmptyNode() + { + var model = GQLParser.parse(JsonToHtmlConstants.kBlankDocument); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "" }, multipleRTE); + Assert.Equal("", singleRTE); + } + [Fact] + public void Should_Return_Result_PlainText_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kPlainTextJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kPlainTextHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kPlainTextHtml, singleRTE); + } + + [Fact] + public void Should_Return_Blank_Result_For_AssetReference_Without_Embedded_Items() + { + var model = GQLParser.parse(JsonToHtmlConstants.kAssetReferenceJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "" }, multipleRTE); + Assert.Equal("", singleRTE); + } + + [Fact] + public void Should_Return_Result_For_AssetReference_With_Embedded_Items() + { + var model = GQLParser.parse(JsonToHtmlConstants.kAssetReferenceJson, JsonToHtmlConstants.KAssetNode); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "\"dummy.pdf\"" }, multipleRTE); + Assert.Equal("\"dummy.pdf\"", singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Block() + { + var model = GQLParser.parse(JsonToHtmlConstants.kEntryReferenceBlockJson, JsonToHtmlConstants.KEntryBlocNode); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "

    UID_07

    Content type: content_block

    " }, multipleRTE); + Assert.Equal("

    UID_07

    Content type: content_block

    ", singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Link() + { + var model = GQLParser.parse(JsonToHtmlConstants.kEntryReferenceLinkJson, JsonToHtmlConstants.KEntryLinkNode); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "/copy-of-entry-final-02" }, multipleRTE); + Assert.Equal("/copy-of-entry-final-02", singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Inline() + { + var model = GQLParser.parse(JsonToHtmlConstants.kEntryReferenceInlineJson, JsonToHtmlConstants.KEntryInlineNode); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "UID_09" }, multipleRTE); + Assert.Equal("UID_09", singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Paragraph_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kParagraphJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kParagraphHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kParagraphHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Link_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kLinkInPJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kLinkInPHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kLinkInPHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Image_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kImgJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kImgHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kImgHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Embed_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kEmbedJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kEmbedHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kEmbedHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Header_1_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kH1Json); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH1Html }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kH1Html, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Header_2_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kH2Json); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH2Html }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kH2Html, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Header_3_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kH3Json); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH3Html }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kH3Html, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Header_4_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kH4Json); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH4Html }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kH4Html, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Header_5_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kH5Json); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH5Html }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kH5Html, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Header_6_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kH6Json); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH6Html }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kH6Html, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_OrderList_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kOrderListJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kOrderListHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kOrderListHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_UnorderList_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kUnorderListJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kIUnorderListHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kIUnorderListHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Table_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kTableJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kTableHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kTableHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_BlockQuote_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kBlockquoteJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kBlockquoteHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kBlockquoteHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_Code_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kCodeJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kCodeHtml }, multipleRTE); + Assert.Equal(JsonToHtmlResultConstants.kCodeHtml, singleRTE); + } + + [Fact] + public void Should_Return_Result_For_HR_Document() + { + var model = GQLParser.parse(JsonToHtmlConstants.kHRJson); + + var multipleRTE = GQL.JsonToHtml(model.multiplerte, defaultRender); + var singleRTE = GQL.JsonToHtml(model.singlerte, defaultRender); + + Assert.Equal(new List() { "
    " }, multipleRTE); + Assert.Equal("
    ", singleRTE); + } + } +} diff --git a/Contentstack.Utils.Tests/Helpers/NodeParser.cs b/Contentstack.Utils.Tests/Helpers/NodeParser.cs new file mode 100644 index 0000000..4ee6ac7 --- /dev/null +++ b/Contentstack.Utils.Tests/Helpers/NodeParser.cs @@ -0,0 +1,31 @@ +using Contentstack.Utils.Interfaces; +using Contentstack.Utils.Models; +using Contentstack.Utils.Tests.Constants; +using Contentstack.Utils.Tests.Mocks; +using Newtonsoft.Json; + +namespace Contentstack.Utils.Tests.Helpers +{ + public class NodeParser + { + public static Node parse(string jsonNode) + { + JsonSerializerSettings SerializerSettings = new JsonSerializerSettings(); + JsonSerializer Serializer = JsonSerializer.Create(SerializerSettings); + + return JsonConvert.DeserializeObject(jsonNode, SerializerSettings); + } + } + public class GQLParser + { + public static GQLModel parse(string jsonNode, string embedConnection = null) where T: IEmbeddedObject + { + var data = JsonToHtmlConstants.KGQLModel(jsonNode, embedConnection); + JsonSerializerSettings SerializerSettings = new JsonSerializerSettings(); + JsonSerializer Serializer = JsonSerializer.Create(SerializerSettings); + return JsonConvert.DeserializeObject>(data, SerializerSettings); + } + } + +} + diff --git a/Contentstack.Utils.Tests/HtmlDocumentExtensionTest.cs b/Contentstack.Utils.Tests/HtmlDocumentExtensionTest.cs new file mode 100644 index 0000000..defa83d --- /dev/null +++ b/Contentstack.Utils.Tests/HtmlDocumentExtensionTest.cs @@ -0,0 +1,261 @@ +using Xunit; +using Contentstack.Utils.Extensions; +using Contentstack.Utils.Models; +using HtmlAgilityPack; +using System; + +namespace Contentstack.Utils.Tests +{ + public class HtmlDocumentExtensionTest + { + HtmlDocument doc = new HtmlDocument(); + + [Fact] + public void testBlankString() + { + doc.LoadHtml(Constants.Constants.kBlankString); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.True(false, "Should not call on non xml string"); + }); + } + + [Fact] + public void testNonHtmlString() + { + doc.LoadHtml(Constants.Constants.kNoHTML); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.True(false, "Should not call on non xml string"); + }); + } + + [Fact] + public void testHtmlString() + { + doc.LoadHtml(Constants.Constants.kSimpleHTML); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.True(false, "Should not call on non xml string"); + }); + } + + [Fact] + public void testUnexpectedClose() + { + doc.LoadHtml(Constants.Constants.kUnexpectedClose); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("uid", metadata.ItemUid); + Assert.Equal("data-sys-content-type-uid", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("", metadata.Text); + }); + } + + [Fact] + public void testNoChildmodel() + { + doc.LoadHtml(Constants.Constants.kNoChildNode); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("uid", metadata.ItemUid); + Assert.Equal("data-sys-content-type-uid", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("", metadata.Text); + }); + } + + [Fact] + public void testAssetDisplay() + { + doc.LoadHtml(Constants.Constants.kAssetDisplay); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.Equal(Enums.EmbedItemType.Asset, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("sys_assets", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Display, metadata.StyleType); + Assert.Equal("", metadata.Text); + }); + } + + [Fact] + public void kEntryBlock() + { + doc.LoadHtml(Constants.Constants.kEntryBlock); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + }); + } + + [Fact] + public void testEntryInline() + { + doc.LoadHtml(Constants.Constants.kEntryInline); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + }); + } + + [Fact] + public void testEntryLink() + { + doc.LoadHtml(Constants.Constants.kEntryLink); + doc.FindEmbeddedObject((Metadata metadata) => + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Link, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + }); + } + + [Fact] + public void testAsset() + { + doc.LoadHtml(Constants.Constants.kAssetEmbed); + doc.FindEmbeddedObject((Metadata metadata) => + { + if (metadata.ItemUid == "UID_02") + { + Assert.Equal(Enums.EmbedItemType.Asset, metadata.ItemType); + Assert.Equal("UID_02", metadata.ItemUid); + Assert.Equal("sys_assets", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Display, metadata.StyleType); + Assert.Equal("", metadata.Text); + Assert.Equal("UID_02", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-uid"].Value); + Assert.Equal("Cuvier-67_Autruche_d_Afrique.jpg", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-alt"].Value); + Assert.Equal("http://abc.com", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-link"].Value); + Assert.Equal("https://image.contentstack.com/v3/5f74813386c10/clitud.jpeg", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-filelink"].Value); + Assert.Equal("center", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-position"].Value); + Assert.Equal("somecaption", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-caption"].Value); + Assert.Equal("image/jpeg", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-contenttype"].Value); + Assert.Equal("true", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-isnewtab"].Value); + Assert.Equal("Cuvier-67_Autruche_d_Afrique.jpg", ((HtmlAttributeCollection)metadata.attributes)["data-sys-asset-filename"].Value); + } + }); + } + + [Fact] + public void testEntryBlockLink() + { + int callbackCount = 0; + doc.LoadHtml($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}"); + doc.FindEmbeddedObject((Metadata metadata) => + { + callbackCount++; + if (metadata.StyleType == Enums.StyleType.Link) + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Link, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + else + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + }); + Assert.Equal(2, callbackCount); + } + + [Fact] + public void testEntryBlockLinkInline() + { + int callbackCount = 0; + doc.LoadHtml($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}{Constants.Constants.kEntryInline}"); + doc.FindEmbeddedObject((Metadata metadata) => + { + callbackCount++; + if (metadata.StyleType == Enums.StyleType.Link) + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Link, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + else if (metadata.StyleType == Enums.StyleType.Inline) + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + else + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + }); + Assert.Equal(3, callbackCount); + } + + [Fact] + public void testAllEmbedStyles() + { + int callbackCount = 0; + doc.LoadHtml($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}{Constants.Constants.kEntryInline}"); + doc.FindEmbeddedObject((Metadata metadata) => + { + callbackCount++; + if (metadata.StyleType == Enums.StyleType.Display) + { + Assert.Equal(Enums.EmbedItemType.Asset, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("sys_assets", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Display, metadata.StyleType); + Assert.Equal("", metadata.Text); + } + else if(metadata.StyleType == Enums.StyleType.Link) + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Link, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + else if (metadata.StyleType == Enums.StyleType.Inline) + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + else + { + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal("UID_01", metadata.ItemUid); + Assert.Equal("article", metadata.ContentTypeUid); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("{{title}}", metadata.Text); + } + }); + Assert.Equal(4, callbackCount); + } + } +} diff --git a/Contentstack.Utils.Tests/JsonToHtmlTest.cs b/Contentstack.Utils.Tests/JsonToHtmlTest.cs new file mode 100644 index 0000000..6f15636 --- /dev/null +++ b/Contentstack.Utils.Tests/JsonToHtmlTest.cs @@ -0,0 +1,463 @@ +using Xunit; +using Contentstack.Utils.Tests.Mocks; +using System.Collections.Generic; +using Contentstack.Utils.Models; +using Contentstack.Utils.Tests.Helpers; +using Contentstack.Utils.Tests.Constants; + +namespace Contentstack.Utils.Tests +{ + public class JsonToHtmlTest + { + DefaultRenderMock defaultRender = new DefaultRenderMock(null); + + [Fact] + public void Should_Return_Empty_String_For_EmptyNode() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kBlankDocument); + + var result = Utils.JsonToHtml(node, defaultRender); + Assert.Equal("", result); + } + + [Fact] + public void Should_Return_Empty_List_String_For_EmptyNode_Array() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kBlankDocument); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { "" }, result); + } + + [Fact] + public void Should_Return_Result_PlainText_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kPlainTextJson); + + var result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kPlainTextHtml, result); + } + + [Fact] + public void Should_Return_Result_Array_PlainText_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kPlainTextJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kPlainTextHtml }, result); + } + + [Fact] + public void Should_Return_Blank_Result_For_AssetReference_Without_Embedded_Items () + { + Node node = NodeParser.parse(JsonToHtmlConstants.kAssetReferenceJson); + + var result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal("", result); + } + + [Fact] + public void Should_Return_Result_For_AssetReference_With_Embedded_Items() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kAssetReferenceJson); + + var result = Utils.JsonToHtml(node, new DefaultRenderMock(new EmbeddedModel("", embedAssetUID: "UID_12"))); + + Assert.Equal("\"title\"", result); + } + + [Fact] + public void Should_Return_Result_For_AssetReference_Array() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kAssetReferenceJson); + + var result = Utils.JsonToHtml(new List() { node }, new DefaultRenderMock(new EmbeddedModel("", embedAssetUID: "UID_12"))); + + Assert.Equal(new List() { "\"title\"" }, result); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Block() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceBlockJson); + + var result = Utils.JsonToHtml(node, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_07", contentTypeUid: "content_block"))); + + Assert.Equal("

    UID_07

    Content type: content_block

    ", result); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Block_Array() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceBlockJson); + + var result = Utils.JsonToHtml(new List() { node }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_07", contentTypeUid: "content_block"))); + + Assert.Equal(new List() { "

    UID_07

    Content type: content_block

    " }, result); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Link() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceLinkJson); + + var result = Utils.JsonToHtml(node, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_08", contentTypeUid: "embeddedrte"))); + + Assert.Equal("/copy-of-entry-final-02", result); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Link_Array() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceLinkJson); + + var result = Utils.JsonToHtml(new List() { node }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_08", contentTypeUid: "embeddedrte"))); + + Assert.Equal(new List() { "/copy-of-entry-final-02" }, result); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Inline() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceInlineJson); + + var result = Utils.JsonToHtml(node, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_09", contentTypeUid: "embeddedrte"))); + + Assert.Equal("UID_09", result); + } + + [Fact] + public void Should_Return_Result_For_Reference_Entry_As_Inline_Array() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceInlineJson); + + var result = Utils.JsonToHtml(new List() { node }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_09", contentTypeUid: "embeddedrte"))); + + Assert.Equal(new List() { "UID_09" }, result); + } + + [Fact] + public void Should_Return_Result_For_Paragraph_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kParagraphJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kParagraphHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Paragraph_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kParagraphJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kParagraphHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_Link_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kLinkInPJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kLinkInPHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Link_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kLinkInPJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kLinkInPHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_Image_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kImgJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kImgHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Image_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kImgJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kImgHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_Embed_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEmbedJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kEmbedHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Embed_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEmbedJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kEmbedHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_Header_1_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH1Json); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kH1Html, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Header_1_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH1Json); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH1Html }, result); + } + + [Fact] + public void Should_Return_Result_For_Header_2_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH2Json); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kH2Html, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Header_2_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH2Json); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH2Html }, result); + } + + [Fact] + public void Should_Return_Result_For_Header_3_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH3Json); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kH3Html, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Header_3_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH3Json); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH3Html }, result); + } + + [Fact] + public void Should_Return_Result_For_Header_4_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH4Json); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kH4Html, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Header_4_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH4Json); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH4Html }, result); + } + + [Fact] + public void Should_Return_Result_For_Header_5_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH5Json); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kH5Html, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Header_5_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH5Json); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH5Html }, result); + } + + [Fact] + public void Should_Return_Result_For_Header_6_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH6Json); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kH6Html, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Header_6_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kH6Json); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kH6Html }, result); + } + + [Fact] + public void Should_Return_Result_For_OrderList_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kOrderListJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kOrderListHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_OrderList_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kOrderListJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kOrderListHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_UnorderList_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kUnorderListJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kIUnorderListHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_UnorderList_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kUnorderListJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kIUnorderListHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_Table_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kTableJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kTableHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Table_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kTableJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kTableHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_BlockQuote_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kBlockquoteJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kBlockquoteHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_BlockQuote_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kBlockquoteJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kBlockquoteHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_Code_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kCodeJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kCodeHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Array_Code_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kCodeJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.kCodeHtml }, result); + } + + [Fact] + public void Should_Return_Result_For_HR_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kHRJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal("
    ", result); + } + + [Fact] + public void Should_Return_Result_For_Array_Hr_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kHRJson); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { "
    " }, result); + } + } +} diff --git a/Contentstack.Utils.Tests/MetadataTest.cs b/Contentstack.Utils.Tests/MetadataTest.cs new file mode 100644 index 0000000..1088591 --- /dev/null +++ b/Contentstack.Utils.Tests/MetadataTest.cs @@ -0,0 +1,161 @@ +using Contentstack.Utils.Models; +using Xunit; +using HtmlAgilityPack; +using Contentstack.Utils.Tests.Helpers; +using Contentstack.Utils.Tests.Constants; +using System.Collections.Generic; + +namespace Contentstack.Utils.Tests +{ + public class MetadataTest + { + HtmlDocument doc = new HtmlDocument(); + + [Fact] + public void testBlankAttributes() + { + var html = "

    TEST

    "; + doc.LoadHtml(html); + var htmlNode = doc.DocumentNode.SelectNodes("//h1"); + foreach(var node in htmlNode) + { + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("", metadata.ItemUid); + Assert.Equal("", metadata.ContentTypeUid); + Assert.Equal("TEST", metadata.Text); + Assert.Empty(((HtmlAttributeCollection)metadata.attributes)); + Assert.Equal(doc.DocumentNode.OuterHtml, metadata.OuterHTML); + } + } + + [Fact] + public void testWrongAttributes() + { + var html = "

    TEST

    "; + doc.LoadHtml(html); + var htmlNode = doc.DocumentNode.SelectNodes("//h1"); + foreach (var node in htmlNode) + { + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("", metadata.ItemUid); + Assert.Equal("", metadata.ContentTypeUid); + Assert.Equal("TEST", metadata.Text); + Assert.Equal(4, ((HtmlAttributeCollection)metadata.attributes).Count); + Assert.Equal(doc.DocumentNode.OuterHtml, metadata.OuterHTML); + } + } + + [Fact] + public void testAttributes() + { + var html = "

    " + + "TEST "; + doc.LoadHtml(html); + var htmlNode = doc.DocumentNode.SelectNodes("//h1"); + foreach (var node in htmlNode) + { + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("uid", metadata.ItemUid); + Assert.Equal("contentType", metadata.ContentTypeUid); + Assert.Equal("TEST ", metadata.Text); + Assert.Equal(4, ((HtmlAttributeCollection)metadata.attributes).Count); + Assert.Equal(doc.DocumentNode.OuterHtml, metadata.OuterHTML); + } + } + + [Fact] + public void testAssetUidAttributes() + { + var html = "

    " + + "TEST "; + doc.LoadHtml(html); + var htmlNode = doc.DocumentNode.SelectNodes("//h1"); + foreach (var node in htmlNode) + { + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Asset, metadata.ItemType); + Assert.Equal(Enums.StyleType.Display, metadata.StyleType); + Assert.Equal("assetuid", metadata.ItemUid); + Assert.Equal("", metadata.ContentTypeUid); + Assert.Equal("TEST ", metadata.Text); + Assert.Equal(3, ((HtmlAttributeCollection)metadata.attributes).Count); + Assert.Equal(doc.DocumentNode.OuterHtml, metadata.OuterHTML); + } + } + + [Fact] + public void Should_Parse_Reference_Asset_Node_To_Metadata () + { + Node node = NodeParser.parse(JsonToHtmlConstants.kAssetReferenceJson).children[0]; + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Asset, metadata.ItemType); + Assert.Equal(Enums.StyleType.Display, metadata.StyleType); + Assert.Equal("UID_12", metadata.ItemUid); + Assert.Equal("sys_assets", metadata.ContentTypeUid); + Assert.Equal("", metadata.Text); + Assert.Equal(11, ((IDictionary)metadata.attributes).Count); + Assert.Equal("", metadata.OuterHTML); + } + [Fact] + public void Should_Parse_Node_Doc_To_Metadata() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kAssetReferenceJson); + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("", metadata.ItemUid); + Assert.Equal("", metadata.ContentTypeUid); + Assert.Equal("", metadata.Text); + Assert.Equal(0, ((IDictionary)metadata.attributes).Count); + Assert.Equal("", metadata.OuterHTML); + } + + [Fact] + public void Should_Parse_Reference_Entry_Block_Node_To_Metadata() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceBlockJson).children[0]; + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Block, metadata.StyleType); + Assert.Equal("UID_07", metadata.ItemUid); + Assert.Equal("content_block", metadata.ContentTypeUid); + Assert.Equal("", metadata.Text); + Assert.Equal(6, ((IDictionary)metadata.attributes).Count); + Assert.Equal("", metadata.OuterHTML); + } + + [Fact] + public void Should_Parse_Reference_Entry_Link_Node_To_Metadata() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceLinkJson).children[0]; + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Link, metadata.StyleType); + Assert.Equal("UID_08", metadata.ItemUid); + Assert.Equal("embeddedrte", metadata.ContentTypeUid); + Assert.Equal("/copy-of-entry-final-02", metadata.Text); + Assert.Equal(8, ((IDictionary)metadata.attributes).Count); + Assert.Equal("", metadata.OuterHTML); + } + + [Fact] + public void Should_Parse_Reference_Entry_Inline_Node_To_Metadata() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kEntryReferenceInlineJson).children[0]; + Metadata metadata = node; + Assert.Equal(Enums.EmbedItemType.Entry, metadata.ItemType); + Assert.Equal(Enums.StyleType.Inline, metadata.StyleType); + Assert.Equal("UID_09", metadata.ItemUid); + Assert.Equal("embeddedrte", metadata.ContentTypeUid); + Assert.Equal("", metadata.Text); + Assert.Equal(6, ((IDictionary)metadata.attributes).Count); + Assert.Equal("", metadata.OuterHTML); + } + } +} diff --git a/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs b/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs new file mode 100644 index 0000000..b74f0d0 --- /dev/null +++ b/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using Contentstack.Utils.Interfaces; +using Contentstack.Utils.Models; +using HtmlAgilityPack; + +namespace Contentstack.Utils.Tests.Mocks +{ + public class CustomRenderOptionMock : Options + { + public CustomRenderOptionMock(IEntryEmbedable entry) : base(entry) + { + } + public override string RenderOption(IEmbeddedObject embeddedObject, Metadata metadata) + { + var attributeStringList = new List(); + foreach (var attribute in (HtmlAttributeCollection)metadata.attributes) + { + attributeStringList.Add($" {attribute.Name}=\"{attribute.Value}\""); + } + var attributeString = string.Join(" ", attributeStringList); + switch (metadata.StyleType) + { + case Enums.StyleType.Block: + string renderString = ""; + if (embeddedObject is IEmbeddedEntry) + { + renderString += $"
    {((IEmbeddedEntry)embeddedObject).Title}
    "; + } + else + { + renderString += $"
    {embeddedObject.Uid}
    "; + } + return renderString; + + case Enums.StyleType.Inline: + if (embeddedObject is IEmbeddedEntry) + { + return $"{((IEmbeddedEntry)embeddedObject).Title}"; + } + else + { + return $"{embeddedObject.Uid}"; + } + case Enums.StyleType.Link: + if (embeddedObject is IEmbeddedEntry) + { + return $" Please find link to: {metadata.Text ?? ((IEmbeddedEntry)embeddedObject).Title}"; + } + else + { + return $" Please find link to: {metadata.Text ?? embeddedObject.Uid}"; + } + case Enums.StyleType.Display: + if (embeddedObject is IEmbeddedAsset) + { + return $"{((IEmbeddedAsset)embeddedObject).Title}

    {((IEmbeddedAsset)embeddedObject).FileName} image:

    "; + } + return "\"""; + + case Enums.StyleType.Download: + if (embeddedObject is IEmbeddedAsset) + { + return " Please find link to: " + (metadata.Text ?? ((IEmbeddedAsset)embeddedObject).Title) + ""; + } + return "" + (metadata.Text ?? embeddedObject.Uid) + ""; + } + return base.RenderOption(embeddedObject, metadata); + } + } +} diff --git a/Contentstack.Utils.Tests/Mocks/DefaultRenderMock.cs b/Contentstack.Utils.Tests/Mocks/DefaultRenderMock.cs new file mode 100644 index 0000000..0e0a4af --- /dev/null +++ b/Contentstack.Utils.Tests/Mocks/DefaultRenderMock.cs @@ -0,0 +1,21 @@ +using System; +using Contentstack.Utils.Interfaces; +using Contentstack.Utils.Models; + +namespace Contentstack.Utils.Tests.Mocks +{ + public class DefaultRenderMock : Options + { + public DefaultRenderMock() : base() + { + } + + public DefaultRenderMock(IEntryEmbedable entry) : base(entry) + { + } + public override string RenderOption(IEmbeddedObject entry, Metadata metadata) + { + return base.RenderOption(entry, metadata); + } + } +} diff --git a/Contentstack.Utils.Tests/Mocks/EmbeddedModelMock.cs b/Contentstack.Utils.Tests/Mocks/EmbeddedModelMock.cs new file mode 100644 index 0000000..71cf026 --- /dev/null +++ b/Contentstack.Utils.Tests/Mocks/EmbeddedModelMock.cs @@ -0,0 +1,167 @@ +using System.Collections.Generic; +using Contentstack.Utils.Enums; +using Contentstack.Utils.Interfaces; +namespace Contentstack.Utils.Tests.Mocks +{ + public class EmbeddedModel : IEntryEmbedable + { + string rte; + + public Dictionary> embeddedItems { get; set; } + + public EmbeddedModel(string rte, string embedContentUID = "uid", string contentTypeUid = "data-sys-content-type-uid", string embedAssetUID = "uid") + { + this.rte = rte; + embeddedItems = new Dictionary>() + { + ["rte"] = new List { + new EmbeddedContentTypeUidModel { Uid = embedContentUID, ContentTypeUid = contentTypeUid }, + new EmbeddedAssetModel { Uid = embedAssetUID } + } + }; + } + } + + class Embedded : IEmbeddedObject + { + public string Uid { get; set; } + public string ContentTypeUid { get; set; } + + public string renderString(StyleType styleType, string text = null){ + switch (styleType) { + case StyleType.Block: + return "

    " + (this.Uid) + "

    Content type: " + this.ContentTypeUid + "

    "; + case StyleType.Inline: + return "" + this.Uid + ""; + case StyleType.Link: + return "" + (text ?? this.Uid) + ""; + case StyleType.Display: + return "\"""; + case StyleType.Download: + return "" + (text ?? this.Uid) + ""; + } + return ""; + } + } + + + public class EmbeddedContentTypeUidModel: IEmbeddedObject + { + public string Uid { get; set; } + public string ContentTypeUid { get; set; } + + public string renderString(StyleType styleType, string text = null) + { + switch (styleType) + { + case StyleType.Block: + return "

    " + this.Uid + "

    Content type: " + this.ContentTypeUid + "

    "; + case StyleType.Inline: + return "" + this.Uid + ""; + case StyleType.Link: + return "" + (text ?? this.Uid) + ""; + default: + break; + } + return ""; + } + } + + public class EmbeddedEntryModel : IEmbeddedEntry + { + public string Uid { get; set; } + + public string ContentTypeUid { get; set; } + + public string Title + { + get + { + return "title"; + } + set + { + } + } + + public string renderString(StyleType styleType, string text = null) + { + switch (styleType) + { + case StyleType.Block: + return "

    " + this.Uid + "

    Content type: " + this.Title + "

    "; + case StyleType.Inline: + return "" + this.Title + ""; + case StyleType.Link: + return "" + (text ?? this.Title) + ""; + default: + break; + } + return ""; + } + } + + public class EmbeddedAssetModel : IEmbeddedAsset + { + public string Title + { + get + { + return "title"; + } + set + { + } + } + + public string FileName + { + get + { + return "filename"; + } + set + { + } + } + + public string Url + { + get + { + return "url"; + } + set + { + } + } + + public string ContentTypeUid + { + get + { + return "sys_assets"; + } + set + { + + } + } + + public string Uid { get; set; } + + public string renderString(StyleType styleType, string text = null) + { + switch (styleType) + { + case StyleType.Display: + return "\"""; + case StyleType.Download: + return "" + (text ?? this.Title) + ""; + default: + break; + } + return ""; + } + } +} diff --git a/Contentstack.Utils.Tests/Mocks/EntryEmbeded.json b/Contentstack.Utils.Tests/Mocks/EntryEmbeded.json new file mode 100644 index 0000000..fd21850 --- /dev/null +++ b/Contentstack.Utils.Tests/Mocks/EntryEmbeded.json @@ -0,0 +1,81 @@ +{ + "title": "entry and assets", + "url": "/entry-and-assets", + "rich_text_editor": "
    \n

    \n
    ", + "locale": "en-us", + "_in_progress": false, + "uid": "UID_15", + "rte": "
    \n
    \n

    ", + "_embedded_entries": { + "rte": [ + { + "title": "Update this title", + "url": "", + "locale": "en-us", + "uid": "UID_07", + "_content_type_uid": "content_block", + "_version": 5, + "_in_progress": false, + "multi_line": "", + "_embedded_entries": [ + { + "uid": "UID_07", + "_content_type_uid": "content_block" + } + ], + "rich_text_editor": "
    " + }, + { + "title": "updated title", + "rich_text_editor": "
    ", + "locale": "en-us", + "uid": "UID_09", + "_content_type_uid": "embeddedrte", + + "_in_progress": false, + "_embedded_assets": [ + { + "uid": "UID_10" + } + ] + }, + { + "title": "Entry with embedded entry", + "rich_text_editor": "
    \n
    \n



    \n
    ", + "locale": "en-us", + "uid": "UID_08", + "_content_type_uid": "embeddedrte", + "_in_progress": false, + "_embedded_entries": [ + { + "uid": "UID_16", + "_content_type_uid": "1234" + }, + { + "uid": "UID_16", + "_content_type_uid": "1234" + } + ], + "_embedded_assets": [ + { + "uid": "UID_19" + } + ] + } + ] + }, + "_embedded_assets": { + "rte": [ + { + "uid": "UID_11", + "content_type": "image/png", + "file_size": "36743", + "filename": "svg-logo-text.png", + "url": "/v3/assets/UID_11/svg-logo-text.png", + "title": "svg-logo-text.png", + "description": "" + } + ] + } +} + diff --git a/Contentstack.Utils.Tests/Mocks/GQLModel.cs b/Contentstack.Utils.Tests/Mocks/GQLModel.cs new file mode 100644 index 0000000..586ff39 --- /dev/null +++ b/Contentstack.Utils.Tests/Mocks/GQLModel.cs @@ -0,0 +1,74 @@ +using System; +using Contentstack.Utils.Converters; +using Contentstack.Utils.Interfaces; +using Contentstack.Utils.Models; +using Newtonsoft.Json; + +namespace Contentstack.Utils.Tests.Mocks +{ + public class GQLModel where T: IEmbeddedObject + { + [Newtonsoft.Json.JsonConverter(typeof(RTEJsonConverter))] + public JsonRTENodes multiplerte { get; set; } + public JsonRTENode singlerte { get; set; } + } + + [Newtonsoft.Json.JsonConverter(typeof(RTEJsonConverter))] + public class EntryModel : IEmbeddedEntry + { + [JsonProperty("system.uid")] + public string Uid + { + get; + set; + } + [JsonProperty("system.content_type_uid")] + public string ContentTypeUid + { + get; + set; + } + [JsonProperty("title")] + public string Title + { + get; + set; + } + } + + [Newtonsoft.Json.JsonConverter(typeof(RTEJsonConverter))] + public class AssetModel : IEmbeddedAsset + { + [JsonProperty("system.uid")] + public string Uid + { + get; + set; + } + [JsonProperty("system.content_type_uid")] + public string ContentTypeUid + { + get; + set; + } + [JsonProperty("title")] + public string Title + { + get; + set; + } + [JsonProperty("filename")] + public string FileName + { + get; + set; + } + [JsonProperty("url")] + public string Url + { + get; + set; + } + } +} + diff --git a/Contentstack.Utils.Tests/UtilsArrayStringTest.cs b/Contentstack.Utils.Tests/UtilsArrayStringTest.cs new file mode 100644 index 0000000..2ac7fd5 --- /dev/null +++ b/Contentstack.Utils.Tests/UtilsArrayStringTest.cs @@ -0,0 +1,141 @@ +using Xunit; +using Contentstack.Utils.Tests.Mocks; +using System.Collections.Generic; +using Contentstack.Utils.Interfaces; + +namespace Contentstack.Utils.Tests +{ + public class UtilsArrayStringTest + { + DefaultRenderMock defaultRender = new DefaultRenderMock(new EmbeddedModel("")); + [Fact] + public void testRenderBlankString() + { + List result = Utils.RenderContent(new List() { "" }, defaultRender); + Assert.Equal("", result[0]); + } + + [Fact] + public void testRenderString() + { + string renderString = "

    TEST

    "; + List result = Utils.RenderContent(new List() { renderString }, defaultRender); + Assert.Equal("

    TEST

    ", result[0]); + } + + [Fact] + public void testNonHtmlString() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kNoHTML }, defaultRender); + Assert.Equal(Constants.Constants.kNoHTML, result[0]); + } + + [Fact] + public void testHtmlString() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kSimpleHTML }, defaultRender); + Assert.Equal(Constants.Constants.kSimpleHTML, result[0]); + } + + [Fact] + public void testUnexpectedClose() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kUnexpectedClose }, defaultRender); + Assert.Equal("uid", result[0]); + } + + [Fact] + public void testNoChildmodel() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kNoChildNode }, defaultRender); + Assert.Equal("uid", result[0]); + } + + [Fact] + public void testAssetDisplay() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kAssetDisplay }, new DefaultRenderMock(new EmbeddedModel("", embedAssetUID: "UID_01"))); + Assert.Equal("\"title\"", result[0]); + } + + [Fact] + public void testEntryBlock() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kEntryBlock }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    ", result[0]); + } + + [Fact] + public void testEntryInline() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kEntryInline }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("UID_01", result[0]); + } + + [Fact] + public void testEntryLink() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kEntryLink }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("{{title}}", result[0]); + } + + [Fact] + public void testAssetAll() + { + List result = Utils.RenderContent(new List() { Constants.Constants.kAssetEmbed }, new DefaultRenderMock(new EmbeddedModel("", "UID_01"))); + Assert.Equal("

    ", result[0]); + + var embModel = new EmbeddedModel(""); + embModel.embeddedItems = new Dictionary>() + { + ["rte"] = new List { + new EmbeddedAssetModel { Uid = "UID_02" }, + new EmbeddedAssetModel { Uid = "UID_03" } + } + }; + + result = Utils.RenderContent(new List() { Constants.Constants.kAssetEmbed }, new DefaultRenderMock(embModel)); + Assert.Equal("\"title\"

    \"title\"", result[0]); + } + + [Fact] + public void testEntryBlockLink() + { + List result = Utils.RenderContent(new List() { $"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}" }, defaultRender); + Assert.Equal("", result[0]); + + result = Utils.RenderContent(new List() { $"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}" }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    {{title}}", result[0]); + } + + [Fact] + public void testEntryBlockLinkInline() + { + List result = Utils.RenderContent(new List() { $"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}" }, defaultRender); + Assert.Equal(" ", result[0]); + + result = Utils.RenderContent(new List() { $"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}" }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    {{title}} UID_01", result[0]); + } + + [Fact] + public void testAllEmbedStyles() + { + List result = Utils.RenderContent(new List() { $"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}" }, defaultRender); + Assert.Equal(" ", result[0]); + + result = Utils.RenderContent(new List() { $"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}" }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    {{title}} UID_01", result[0]); + } + + [Fact] + public void testAllEmbedStylesWithAllEmbedObject() + { + List result = Utils.RenderContent(new List() { $"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}" }, defaultRender); + Assert.Equal(" ", result[0]); + + result = Utils.RenderContent(new List() { $"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}" }, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", embedAssetUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("\"title\"

    UID_01

    Content type: article

    {{title}} UID_01", result[0]); + } + } +} diff --git a/Contentstack.Utils.Tests/UtilsCustomRenderTest.cs b/Contentstack.Utils.Tests/UtilsCustomRenderTest.cs new file mode 100644 index 0000000..c048878 --- /dev/null +++ b/Contentstack.Utils.Tests/UtilsCustomRenderTest.cs @@ -0,0 +1,141 @@ +using Xunit; +using Contentstack.Utils.Tests.Mocks; +using System.Collections.Generic; +using Contentstack.Utils.Interfaces; + +namespace Contentstack.Utils.Tests +{ + public class UtilsCustomRenderTest + { + CustomRenderOptionMock customRender = new CustomRenderOptionMock(new EmbeddedModel("")); + [Fact] + public void testRenderBlankString() + { + string result = Utils.RenderContent("", customRender); + Assert.Equal("", result); + } + + [Fact] + public void testRenderString() + { + string renderString = "

    TEST

    "; + string result = Utils.RenderContent(renderString, customRender); + Assert.Equal("

    TEST

    ", result); + } + + [Fact] + public void testNonHtmlString() + { + string result = Utils.RenderContent(Constants.Constants.kNoHTML, customRender); + Assert.Equal(Constants.Constants.kNoHTML, result); + } + + [Fact] + public void testHtmlString() + { + string result = Utils.RenderContent(Constants.Constants.kSimpleHTML, customRender); + Assert.Equal(Constants.Constants.kSimpleHTML, result); + } + + [Fact] + public void testUnexpectedClose() + { + string result = Utils.RenderContent(Constants.Constants.kUnexpectedClose, customRender); + Assert.Equal("uid", result); + } + + [Fact] + public void testNoChildmodel() + { + string result = Utils.RenderContent(Constants.Constants.kNoChildNode, customRender); + Assert.Equal("uid", result); + } + + [Fact] + public void testAssetDisplay() + { + string result = Utils.RenderContent(Constants.Constants.kAssetDisplay, new CustomRenderOptionMock(new EmbeddedModel("", embedAssetUID: "UID_01"))); + Assert.Equal("title

    filename image:

    ", result); + } + + [Fact] + public void testEntryBlock() + { + string result = Utils.RenderContent(Constants.Constants.kEntryBlock, new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("
    UID_01
    ", result); + } + + [Fact] + public void testEntryInline() + { + string result = Utils.RenderContent(Constants.Constants.kEntryInline, new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("UID_01", result); + } + + [Fact] + public void testEntryLink() + { + string result = Utils.RenderContent(Constants.Constants.kEntryLink, new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal(" Please find link to: {{title}}", result); + } + + [Fact] + public void testAssetAll() + { + string result = Utils.RenderContent(Constants.Constants.kAssetEmbed, new CustomRenderOptionMock(new EmbeddedModel("", "UID_01"))); + Assert.Equal("

    ", result); + + var embModel = new EmbeddedModel(""); + embModel.embeddedItems = new Dictionary>() + { + ["rte"] = new List { + new EmbeddedAssetModel { Uid = "UID_02" }, + new EmbeddedAssetModel { Uid = "UID_03" } + } + }; + + result = Utils.RenderContent(Constants.Constants.kAssetEmbed, new CustomRenderOptionMock(embModel)); + Assert.Equal("title

    filename image:

    title

    filename image:

    ", result); + } + + [Fact] + public void testEntryBlockLink() + { + string result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}", customRender); + Assert.Equal("", result); + + result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}", new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("
    UID_01
    Please find link to: {{title}}", result); + } + + [Fact] + public void testEntryBlockLinkInline() + { + string result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", customRender); + Assert.Equal(" ", result); + + result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("
    UID_01
    Please find link to: {{title}} UID_01", result); + } + + [Fact] + public void testAllEmbedStyles() + { + string result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", customRender); + Assert.Equal(" ", result); + + result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("
    UID_01
    Please find link to: {{title}} UID_01", result); + } + + [Fact] + public void testAllEmbedStylesWithAllEmbedObject() + { + string result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", customRender); + Assert.Equal(" ", result); + + result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", new CustomRenderOptionMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article", embedAssetUID: "UID_01"))); + Assert.Equal("title

    filename image:

    UID_01
    Please find link to: {{title}} UID_01", result); + } + } +} diff --git a/Contentstack.Utils.Tests/UtilsTest.cs b/Contentstack.Utils.Tests/UtilsTest.cs new file mode 100644 index 0000000..1f88cf7 --- /dev/null +++ b/Contentstack.Utils.Tests/UtilsTest.cs @@ -0,0 +1,141 @@ +using Xunit; +using Contentstack.Utils.Tests.Mocks; +using System.Collections.Generic; +using Contentstack.Utils.Interfaces; + +namespace Contentstack.Utils.Tests +{ + public class UtilsTest + { + DefaultRenderMock defaultRender = new DefaultRenderMock(new EmbeddedModel("")); + [Fact] + public void testRenderBlankString() + { + string result = Utils.RenderContent("", defaultRender); + Assert.Equal("", result); + } + + [Fact] + public void testRenderString() + { + string renderString = "

    TEST

    "; + string result = Utils.RenderContent(renderString, defaultRender); + Assert.Equal("

    TEST

    ", result); + } + + [Fact] + public void testNonHtmlString() + { + string result = Utils.RenderContent(Constants.Constants.kNoHTML, defaultRender); + Assert.Equal(Constants.Constants.kNoHTML, result); + } + + [Fact] + public void testHtmlString() + { + string result = Utils.RenderContent(Constants.Constants.kSimpleHTML, defaultRender); + Assert.Equal(Constants.Constants.kSimpleHTML, result); + } + + [Fact] + public void testUnexpectedClose() + { + string result = Utils.RenderContent(Constants.Constants.kUnexpectedClose, defaultRender); + Assert.Equal("uid", result); + } + + [Fact] + public void testNoChildmodel() + { + string result = Utils.RenderContent(Constants.Constants.kNoChildNode, defaultRender); + Assert.Equal("uid", result); + } + + [Fact] + public void testAssetDisplay() + { + string result = Utils.RenderContent(Constants.Constants.kAssetDisplay, new DefaultRenderMock(new EmbeddedModel("", embedAssetUID:"UID_01"))); + Assert.Equal("\"title\"", result); + } + + [Fact] + public void testEntryBlock() + { + string result = Utils.RenderContent(Constants.Constants.kEntryBlock, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    ", result); + } + + [Fact] + public void testEntryInline() + { + string result = Utils.RenderContent(Constants.Constants.kEntryInline, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("UID_01", result); + } + + [Fact] + public void testEntryLink() + { + string result = Utils.RenderContent(Constants.Constants.kEntryLink, new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("{{title}}", result); + } + + [Fact] + public void testAssetAll () + { + string result = Utils.RenderContent(Constants.Constants.kAssetEmbed, new DefaultRenderMock(new EmbeddedModel("", "UID_01"))); + Assert.Equal("

    ", result); + + var embModel = new EmbeddedModel(""); + embModel.embeddedItems = new Dictionary>() + { + ["rte"] = new List { + new EmbeddedAssetModel { Uid = "UID_02" }, + new EmbeddedAssetModel { Uid = "UID_03" } + } + }; + + result = Utils.RenderContent(Constants.Constants.kAssetEmbed, new DefaultRenderMock(embModel)); + Assert.Equal("\"title\"

    \"title\"", result); + } + + [Fact] + public void testEntryBlockLink() + { + string result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}", defaultRender); + Assert.Equal("", result); + + result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink}", new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    {{title}}", result); + } + + [Fact] + public void testEntryBlockLinkInline() + { + string result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", defaultRender); + Assert.Equal(" ", result); + + result = Utils.RenderContent($"{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    {{title}} UID_01", result); + } + + [Fact] + public void testAllEmbedStyles() + { + string result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", defaultRender); + Assert.Equal(" ", result); + + result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article"))); + Assert.Equal("

    UID_01

    Content type: article

    {{title}} UID_01", result); + } + + [Fact] + public void testAllEmbedStylesWithAllEmbedObject() + { + string result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", defaultRender); + Assert.Equal(" ", result); + + result = Utils.RenderContent($"{Constants.Constants.kAssetDisplay}{Constants.Constants.kEntryBlock}{Constants.Constants.kEntryLink} {Constants.Constants.kEntryInline}", new DefaultRenderMock(new EmbeddedModel("", embedContentUID: "UID_01", contentTypeUid: "article", embedAssetUID: "UID_01"))); + Assert.Equal("\"title\"

    UID_01

    Content type: article

    {{title}} UID_01", result); + } + } +} From 14e6534b3150dea10c521b6c99233ae25682367a Mon Sep 17 00:00:00 2001 From: contentstack-admin <52040860+contentstack-admin@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:30:00 +0530 Subject: [PATCH 03/83] Create codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 72 +++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..80c352e --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,72 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: '*' + pull_request: + # The branches below must be a subset of the branches above + branches: '*' + schedule: + - cron: '21 5 * * 5' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'csharp' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 From cfff7f5b574b24ff6ddabbbc6d5881d19d2e2fc4 Mon Sep 17 00:00:00 2001 From: contentstack-admin <52040860+contentstack-admin@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:30:56 +0530 Subject: [PATCH 04/83] Create secrets-scan.yml --- .github/workflows/secrets-scan.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/secrets-scan.yml diff --git a/.github/workflows/secrets-scan.yml b/.github/workflows/secrets-scan.yml new file mode 100644 index 0000000..71d6503 --- /dev/null +++ b/.github/workflows/secrets-scan.yml @@ -0,0 +1,14 @@ +name: Secrets Scan +on: + push: + branches: + - '*' + pull_request: + types: [opened, synchronize, reopened] +jobs: + security: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Gittyleaks + uses: gupy-io/gittyleaks-action@v0.1 From 1dd4e885be1a78066a80aa35a5daf638e8a6dab7 Mon Sep 17 00:00:00 2001 From: contentstack-admin <52040860+contentstack-admin@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:31:17 +0530 Subject: [PATCH 05/83] Create sca-monitor.yml --- .github/workflows/sca-monitor.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/workflows/sca-monitor.yml diff --git a/.github/workflows/sca-monitor.yml b/.github/workflows/sca-monitor.yml new file mode 100644 index 0000000..294eab3 --- /dev/null +++ b/.github/workflows/sca-monitor.yml @@ -0,0 +1,13 @@ +name: Source Composition Analysis Monitor +on: push +jobs: + security: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Run Snyk to check for vulnerabilities + uses: snyk/actions/node@master + env: + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + with: + command: monitor From 292130bd795983dcbcc5c9e69a750fb9c43a47b9 Mon Sep 17 00:00:00 2001 From: contentstack-admin <52040860+contentstack-admin@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:31:34 +0530 Subject: [PATCH 06/83] Create sca-scan.yml --- .github/workflows/sca-scan.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/sca-scan.yml diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml new file mode 100644 index 0000000..525e286 --- /dev/null +++ b/.github/workflows/sca-scan.yml @@ -0,0 +1,16 @@ +name: Source Composition Analysis Scan +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + security: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Run Snyk to check for vulnerabilities + uses: snyk/actions/node@master + env: + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} From 1cba09986e407e70cd56455b1ca5a96baaac8076 Mon Sep 17 00:00:00 2001 From: contentstack-admin <52040860+contentstack-admin@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:31:50 +0530 Subject: [PATCH 07/83] Create sast-scan.yml --- .github/workflows/sast-scan.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/sast-scan.yml diff --git a/.github/workflows/sast-scan.yml b/.github/workflows/sast-scan.yml new file mode 100644 index 0000000..21f1485 --- /dev/null +++ b/.github/workflows/sast-scan.yml @@ -0,0 +1,14 @@ +name: SAST Scan +on: + push: + branches: + - '*' + pull_request: + types: [opened, synchronize, reopened] +jobs: + security: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Horusec Scan + run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/src horuszup/horusec-cli:latest horusec start -p /src -P $(pwd) From b7b9390484c1531ef625d955117f1d215cdf94ab Mon Sep 17 00:00:00 2001 From: contentstack-admin <52040860+contentstack-admin@users.noreply.github.com> Date: Wed, 15 Jun 2022 01:30:47 +0530 Subject: [PATCH 08/83] Update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 80c352e..6b8662b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -17,8 +17,6 @@ on: pull_request: # The branches below must be a subset of the branches above branches: '*' - schedule: - - cron: '21 5 * * 5' jobs: analyze: From afc65eeb737e74f28ea52d5d1aaec9d5e2a4696c Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 2 Aug 2022 10:14:01 +0530 Subject: [PATCH 09/83] Update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6b8662b..58d665b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -12,8 +12,6 @@ name: "CodeQL" on: - push: - branches: '*' pull_request: # The branches below must be a subset of the branches above branches: '*' From 0199c128ee8a7e2e458053ac5a17e4389ea1197e Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 2 Aug 2022 10:14:18 +0530 Subject: [PATCH 10/83] Add files via upload --- .github/workflows/sast-scan.yml | 5 +---- .github/workflows/sca-scan.yml | 5 +---- .github/workflows/secrets-scan.yml | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/sast-scan.yml b/.github/workflows/sast-scan.yml index 21f1485..f931630 100644 --- a/.github/workflows/sast-scan.yml +++ b/.github/workflows/sast-scan.yml @@ -1,8 +1,5 @@ name: SAST Scan on: - push: - branches: - - '*' pull_request: types: [opened, synchronize, reopened] jobs: @@ -11,4 +8,4 @@ jobs: steps: - uses: actions/checkout@v2 - name: Horusec Scan - run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/src horuszup/horusec-cli:latest horusec start -p /src -P $(pwd) + run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/src horuszup/horusec-cli:latest horusec start -p /src -P $(pwd) \ No newline at end of file diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 525e286..7275b41 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -1,8 +1,5 @@ name: Source Composition Analysis Scan on: - push: - branches: - - master pull_request: types: [opened, synchronize, reopened] jobs: @@ -13,4 +10,4 @@ jobs: - name: Run Snyk to check for vulnerabilities uses: snyk/actions/node@master env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/secrets-scan.yml b/.github/workflows/secrets-scan.yml index 71d6503..1e8f176 100644 --- a/.github/workflows/secrets-scan.yml +++ b/.github/workflows/secrets-scan.yml @@ -1,8 +1,5 @@ name: Secrets Scan on: - push: - branches: - - '*' pull_request: types: [opened, synchronize, reopened] jobs: @@ -11,4 +8,4 @@ jobs: steps: - uses: actions/checkout@v2 - name: Gittyleaks - uses: gupy-io/gittyleaks-action@v0.1 + uses: gupy-io/gittyleaks-action@v0.1 \ No newline at end of file From f840e4d8d0409662db1073cf1b9b45cc5652b698 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 2 Aug 2022 10:14:32 +0530 Subject: [PATCH 11/83] Delete sca-monitor.yml --- .github/workflows/sca-monitor.yml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 .github/workflows/sca-monitor.yml diff --git a/.github/workflows/sca-monitor.yml b/.github/workflows/sca-monitor.yml deleted file mode 100644 index 294eab3..0000000 --- a/.github/workflows/sca-monitor.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Source Composition Analysis Monitor -on: push -jobs: - security: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - name: Run Snyk to check for vulnerabilities - uses: snyk/actions/node@master - env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} - with: - command: monitor From 59fa8e225a3e28fc00baec1517453ee9d4d77003 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Thu, 15 Sep 2022 11:15:07 +0530 Subject: [PATCH 12/83] codeql-analysis.yml From ee11fc1ce5e4e95ae1dc6c806668f9131da586ec Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Thu, 15 Sep 2022 11:15:07 +0530 Subject: [PATCH 13/83] sast-scan.yml From c85f777cdd84f3723d0c97cabc47f7711d91a028 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Thu, 15 Sep 2022 11:15:08 +0530 Subject: [PATCH 14/83] sca-scan.yml From 54ba9cbeb86eda632ee9bfa8bee983ba7c53323d Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Thu, 15 Sep 2022 11:15:09 +0530 Subject: [PATCH 15/83] secrets-scan.yml From 94653f9e2a596a53ad6a326bdf77448ee01cad7c Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Wed, 21 Sep 2022 09:56:43 +0530 Subject: [PATCH 16/83] codeql-analysis.yml From 4db1efd8e47fb035106621ba4d10037bc6b5a945 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Wed, 21 Sep 2022 09:56:44 +0530 Subject: [PATCH 17/83] sast-scan.yml From 4b69bc61c196509f1130ae2704856b70c23415ef Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Wed, 21 Sep 2022 09:56:45 +0530 Subject: [PATCH 18/83] sca-scan.yml --- .github/workflows/sca-scan.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 7275b41..a749f40 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -8,6 +8,6 @@ jobs: steps: - uses: actions/checkout@master - name: Run Snyk to check for vulnerabilities - uses: snyk/actions/node@master + uses: snyk/actions/dotnet@master env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} \ No newline at end of file + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} From 3008dabc081863f36143b5ed88d612caa0d07ebc Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Wed, 21 Sep 2022 09:56:45 +0530 Subject: [PATCH 19/83] secrets-scan.yml From 0f6a220868d31ad4e485395a43d75e1dca363326 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Mon, 3 Oct 2022 19:07:17 +0530 Subject: [PATCH 20/83] jira.yml --- .github/workflows/jira.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/jira.yml diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml new file mode 100644 index 0000000..2e12145 --- /dev/null +++ b/.github/workflows/jira.yml @@ -0,0 +1,29 @@ +name: Create JIRA ISSUE +on: + pull_request: + types: [opened] +jobs: + security: + if: ${{ github.actor == 'dependabot[bot]' || github.actor == 'snyk-bot' || contains(github.event.pull_request.head.ref, 'snyk-fix-') || contains(github.event.pull_request.head.ref, 'snyk-upgrade-')}} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Login into JIRA + uses: atlassian/gajira-login@master + env: + JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} + JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} + JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} + - name: Create a JIRA Issue + id: create + uses: atlassian/gajira-create@master + with: + project: ${{ secrets.JIRA_PROJECT }} + issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} + summary: | + ${{ github.event.pull_request.title }} + description: | + PR: ${{ github.event.pull_request.html_url }} + + ${{ github.event.pull_request.body }} + fields: "${{ secrets.JIRA_FIELDS }}" From 19a701b03a97a8758bc8192a4f0d3e9f74f463a2 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 4 Oct 2022 09:53:37 +0530 Subject: [PATCH 21/83] jira.yml --- .github/workflows/jira.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml index 2e12145..5ddf87a 100644 --- a/.github/workflows/jira.yml +++ b/.github/workflows/jira.yml @@ -25,5 +25,4 @@ jobs: description: | PR: ${{ github.event.pull_request.html_url }} - ${{ github.event.pull_request.body }} fields: "${{ secrets.JIRA_FIELDS }}" From 55d23f5e8648cad33811c82b53dbd465ce2c476c Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Fri, 4 Nov 2022 16:40:01 +0530 Subject: [PATCH 22/83] jira.yml From 5e068a5d70c5b4a687f4035b41258d6c45bfa2bb Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 24 Jan 2023 16:16:23 +0530 Subject: [PATCH 23/83] sca-scan.yml --- .github/workflows/sca-scan.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index a749f40..b5b34f2 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -11,3 +11,5 @@ jobs: uses: snyk/actions/dotnet@master env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + with: + args: --fail-on=all From f3862fe627469dc8728a042a9fe710e9295c97aa Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 24 Jan 2023 16:16:35 +0530 Subject: [PATCH 24/83] jira.yml From 48465026d0fd0206873d8859d69940cc9500131c Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 24 Jan 2023 16:16:36 +0530 Subject: [PATCH 25/83] codeql-analysis.yml From 2d12f7e55c4b8f5c5129a117cca2467ff3090d38 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 24 Jan 2023 16:16:37 +0530 Subject: [PATCH 26/83] sast-scan.yml From 0498c139ff338abff3b0960f2680e6dbafd03ddb Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Tue, 24 Jan 2023 16:16:38 +0530 Subject: [PATCH 27/83] secrets-scan.yml From 1872ecdf14fdced3d1be0d9cc639fd0e77effdeb Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Wed, 19 Apr 2023 13:19:13 +0530 Subject: [PATCH 28/83] Add files via upload --- .github/workflows/check-branch.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/check-branch.yml diff --git a/.github/workflows/check-branch.yml b/.github/workflows/check-branch.yml new file mode 100644 index 0000000..1e2d24a --- /dev/null +++ b/.github/workflows/check-branch.yml @@ -0,0 +1,20 @@ +name: 'Check Branch' + +on: + pull_request: + +jobs: + check_branch: + runs-on: ubuntu-latest + steps: + - name: Comment PR + if: github.base_ref == 'master' && github.head_ref != 'next' + uses: thollander/actions-comment-pull-request@v2 + with: + message: | + We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the next branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch. + - name: Check branch + if: github.base_ref == 'master' && github.head_ref != 'next' + run: | + echo "ERROR: We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the next branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch." + exit 1 \ No newline at end of file From c1e04ae4e8aa997fa7f8caca93e7ad9fdde49f95 Mon Sep 17 00:00:00 2001 From: aravindbuilt Date: Sat, 6 May 2023 15:24:39 +0530 Subject: [PATCH 29/83] CODEOWNERS update --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index d81d223..0773923 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @contentstack/security-admin @contentstack/sdk-admin +* @contentstack/security-admin \ No newline at end of file From cc553cb6cb06743c4bee02e854b3c51c499ae739 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 14:06:35 +0530 Subject: [PATCH 30/83] feat: :sparkles: adds style attr in node converted html --- .talismanrc | 4 ++ .../Constants/JsonToHtmlConstants.cs | 4 +- Contentstack.Utils/Models/Options.cs | 66 +++++++++++++------ 3 files changed, 51 insertions(+), 23 deletions(-) create mode 100644 .talismanrc diff --git a/.talismanrc b/.talismanrc new file mode 100644 index 0000000..bd9bf54 --- /dev/null +++ b/.talismanrc @@ -0,0 +1,4 @@ +fileignoreconfig: +- filename: Contentstack.Utils/Models/Options.cs + checksum: 3dc51f0de02429ef9a43b66e666ac4dbde41195e245f8ecc0094548ca8603245 +version: "" \ No newline at end of file diff --git a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs index e1a3451..a4b7ae6 100644 --- a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs +++ b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs @@ -4,7 +4,7 @@ public static class JsonToHtmlResultConstants { public const string kPlainTextHtml = "Aliquam sit amet libero dapibus, eleifend ligula at, varius justoLorem ipsumdolor sit ametconsectetur adipiscing elit.Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. "; public const string kParagraphHtml = "

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. Praesent a diam iaculis turpis rhoncus faucibus. Aliquam sed pulvinar sem.

    "; - public const string kH1Html = "

    Lorem ipsum dolor sit amet.

    "; + public const string kH1Html = "

    Lorem ipsum dolor sit amet.

    "; public const string kH2Html = "

    Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor.

    "; public const string kH3Html = "

    Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.

    "; public const string kH4Html = "

    MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra

    "; @@ -24,7 +24,7 @@ public static class JsonToHtmlConstants { public const string kBlankDocument = "{ \"uid\":\"06e34a7a4e5d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[],\"type\":\"doc\"}"; public const string kPlainTextJson = "{ \"uid\":\"06e34a7a4e5d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"text\":\"Aliquam sit amet libero dapibus, eleifend ligula at, varius justo\",\"bold\":true},{ \"text\":\"Lorem ipsum\",\"bold\":true,\"italic\":true},{ \"text\":\"dolor sit amet\",\"bold\":true,\"italic\":true,\"underline\":true},{ \"text\":\"consectetur adipiscing elit.\",\"bold\":true,\"italic\":true,\"underline\":true,\"strikethrough\":true},{ \"text\":\"Sed condimentum iaculis magna in vehicula. \",\"bold\":true,\"italic\":true,\"underline\":true,\"inlineCode\":true},{ \"text\":\" Vestibulum vitae convallis \",\"bold\":true,\"italic\":true,\"underline\":true,\"superscript\":true},{ \"text\":\" lacus. \",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}],\"type\":\"doc\"}"; - public const string kH1Json = "{ \"uid\":\"06e34a7a449d7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h1\",\"attrs\":{ },\"uid\":\"c2dfed70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Lorem ipsum dolor sit amet.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; + public const string kH1Json = "{ \"uid\":\"06e34a7a449d7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h1\",\"attrs\":{ \"style\": { \"color\": \"blue\", \"font-size\": \"24px\" } },\"uid\":\"c2dfed70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Lorem ipsum dolor sit amet.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; public const string kH2Json = "{ \"uid\":\"06e34a7a4e2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h2\",\"attrs\":{ },\"uid\":\"c2dfed9a7030c65e2e1\",\"children\":[{ \"text\":\"Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor. \",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; public const string kH3Json = "{ \"uid\":\"06e34ad7fc2acd\",\"_version\":13,\"attrs\":{ },\"children\":[{ \"type\":\"h3\",\"attrs\":{ },\"uid\":\"c2df42cfb70 4d7030c65e2e1\",\"children\":[{ \"text\":\"Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; public const string kH4Json = "{ \"uid\":\"06e34a7a4e54cd\", \"_version\":13, \"attrs\":{ \"style\":{ \"text-align\":\"center\" }, \"redactor-attributes\":{ } }, \"children\":[{\"type\":\"h4\",\"attrs\":{},\"uid\":\"c2dfed4d7030c65e2e1\",\"children\":[{\"text\":\"MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true}]}],\"type\":\"doc\"}"; diff --git a/Contentstack.Utils/Models/Options.cs b/Contentstack.Utils/Models/Options.cs index c8553ee..2572f46 100644 --- a/Contentstack.Utils/Models/Options.cs +++ b/Contentstack.Utils/Models/Options.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Contentstack.Utils.Enums; using Contentstack.Utils.Interfaces; @@ -89,66 +90,89 @@ public virtual string RenderMark(MarkType markType, string text) public virtual string RenderNode(string nodeType, Node node, NodeChildrenCallBack callBack) { string href = ""; + string styleAttrs = ""; + + if (node.attrs.ContainsKey("style")) + { + var styleVal = node.attrs["style"]; + if (styleVal != null) + { + if (styleVal is string) + { + styleAttrs = $" style=\"{styleVal}\""; + } + else if (styleVal is IDictionary) + { + var styleDictionary = (IDictionary)styleVal; + styleAttrs = " style=\""; + foreach (var pair in styleDictionary) + { + styleAttrs += $"{pair.Key}:{pair.Value};"; + } + styleAttrs += "\""; + } + } + } switch (nodeType) { case "p": - return $"

    {callBack(node.children)}

    "; + return $"{callBack(node.children)}

    "; case "a": if (node.attrs.ContainsKey("url")) { href = (string)node.attrs["url"]; } - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "img": if (node.attrs.ContainsKey("url")) { href = (string)node.attrs["url"]; } - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "embed": if (node.attrs.ContainsKey("url")) { href = (string)node.attrs["url"]; } - return $""; + return $""; case "h1": - return $"

    {callBack(node.children)}

    "; + return $"{callBack(node.children)}

    "; case "h2": - return $"

    {callBack(node.children)}

    "; + return $"{callBack(node.children)}"; case "h3": - return $"

    {callBack(node.children)}

    "; + return $"{callBack(node.children)}"; case "h4": - return $"

    {callBack(node.children)}

    "; + return $"{callBack(node.children)}"; case "h5": - return $"
    {callBack(node.children)}
    "; + return $"{callBack(node.children)}"; case "h6": - return $"
    {callBack(node.children)}
    "; + return $"{callBack(node.children)}"; case "ol": - return $"
      {callBack(node.children)}
    "; + return $"{callBack(node.children)}"; case "ul": - return $"
      {callBack(node.children)}
    "; + return $"{callBack(node.children)}"; case "li": - return $"
  • {callBack(node.children)}
  • "; + return $"{callBack(node.children)}"; case "hr": return $"
    "; case "table": - return $"{callBack(node.children)}
    "; + return $"{callBack(node.children)}"; case "thead": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "tbody": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "tfoot": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "tr": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "th": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "td": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; case "blockquote": return $"
    {callBack(node.children)}
    "; case "code": - return $"{callBack(node.children)}"; + return $"{callBack(node.children)}"; default: return callBack(node.children); } From e3bd67c4c916148d06698b0181d7ac8992b683df Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 14:07:00 +0530 Subject: [PATCH 31/83] chore: version number changes --- .../Contentstack.Utils.Tests.csproj | 15 +++++++++++---- Contentstack.Utils.sln | 2 +- Contentstack.Utils/Contentstack.Utils.csproj | 6 +++--- Directory.Build.props | 5 +++++ 4 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 Directory.Build.props diff --git a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj index 8c4cf96..02e6e09 100644 --- a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj +++ b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj @@ -1,23 +1,30 @@ - netcoreapp3.1 + netstandard2.0;net47;net472; false - 1.0.1 + $(Version) - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + runtime; build; native; contentfiles; analyzers; buildtransitive all - + + + ..\Contentstack.Utils\bin\Debug\netstandard2.0\Contentstack.Utils.dll + + diff --git a/Contentstack.Utils.sln b/Contentstack.Utils.sln index 288921f..5356759 100644 --- a/Contentstack.Utils.sln +++ b/Contentstack.Utils.sln @@ -21,7 +21,7 @@ Global {EB2B5E23-E45F-4C6C-BF98-FE3971DE4250}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - version = 1.0.1 + version = 1.0.2 Policies = $0 $0.DotNetNamingPolicy = $1 $1.DirectoryNamespaceAssociation = PrefixedHierarchical diff --git a/Contentstack.Utils/Contentstack.Utils.csproj b/Contentstack.Utils/Contentstack.Utils.csproj index 794cfca..311a0cc 100644 --- a/Contentstack.Utils/Contentstack.Utils.csproj +++ b/Contentstack.Utils/Contentstack.Utils.csproj @@ -7,15 +7,15 @@ Contentstack en-US Utils .NET SDK for the Contentstack. 0.1.0 - 1.0.1 + $(Version) Contentstack true - v1.0.1 + v$(Version) Json RTE content to Html content support added Copyright © 2012-2021 Contentstack. All Rights Reserved https://github.com/contentstack/contentstack-utils-dotnet LICENSE.txt - 1.0.1 + $(Version) Contentstack Utils diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..4f93bc6 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,5 @@ + + + 1.0.2 + + From ba5132f68cdb8e727218aa905b313babb8405378 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 14:13:29 +0530 Subject: [PATCH 32/83] chore: LICENSE and Changelog file updated --- CHANGELOG.md | 4 ++++ LICENSE | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 640ad67..355db18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ +### Version: 1.0.2 +#### Date: Mar-14-2024 +- Style attributes supported in converted HTML. + ### Version: 1.0.1 #### Date: July-16-2021 - Json RTE content to Html Support added. diff --git a/LICENSE b/LICENSE index df79778..3333caa 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright © 2012-2021 Contentstack. All Rights Reserved +Copyright © 2012-2024 Contentstack. All Rights Reserved Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From b7c09cfa255425bdba9aefdf3935fd7ec981f512 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 14:30:05 +0530 Subject: [PATCH 33/83] ci: :green_heart: workflow files update --- .github/workflows/ci.yml | 33 --------------------- .github/workflows/nuget-publish.yml | 45 +++++++++++++++++++++++++++++ .github/workflows/sast-scan.yml | 11 ------- .github/workflows/sca-scan.yml | 10 ++++++- .github/workflows/secrets-scan.yml | 11 ------- 5 files changed, 54 insertions(+), 56 deletions(-) delete mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/nuget-publish.yml delete mode 100644 .github/workflows/sast-scan.yml delete mode 100644 .github/workflows/secrets-scan.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 27b2f58..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: .NET Core - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Setup .NET Core 2.1 - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 2.1.x - - name: Setup .NET Core 3.1 - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 3.1.x - - name: Setup .NET Core 5.0 - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.x - - name: Install dependencies - run: dotnet restore - - name: Build - run: dotnet build --configuration Release --no-restore - - name: Test - run: dotnet test --no-restore --verbosity normal diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml new file mode 100644 index 0000000..458476e --- /dev/null +++ b/.github/workflows/nuget-publish.yml @@ -0,0 +1,45 @@ +# This workflow will publish a package when a release is created + +name: Publish package to NuGet repository +on: + release: + types: [created] +jobs: + publish-nuget: + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v1 + - name: Setup .NET Core @ Latest + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '3.1.x' + env: + NUGET_AUTH_TOKEN: ${{ secrets.NUGET_AUTH_TOKEN }} + - name: Build solution and generate NuGet package + run: | + cd contentstack-utils-dotnet + dotnet pack -c Release -o out + + - name: Push generated package to GitHub registry + run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true + + publish-git: + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v1 + - name: Setup .NET Core @ Latest + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '3.1.x' + source-url: https://nuget.pkg.github.com/Contentstack/index.json + env: + NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Build solution and generate NuGet package + run: | + cd contentstack-utils-dotnet + dotnet pack -c Release -o out + + - name: Push generated package to GitHub registry + run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true diff --git a/.github/workflows/sast-scan.yml b/.github/workflows/sast-scan.yml deleted file mode 100644 index f931630..0000000 --- a/.github/workflows/sast-scan.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: SAST Scan -on: - pull_request: - types: [opened, synchronize, reopened] -jobs: - security: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Horusec Scan - run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/src horuszup/horusec-cli:latest horusec start -p /src -P $(pwd) \ No newline at end of file diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index b5b34f2..9dfae1c 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -6,7 +6,15 @@ jobs: security: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - name: Checkout repository + uses: actions/checkout@master + - name: Setup .NET Core @ Latest + uses: actions/setup-dotnet@v1 + with: + dotnet-version: "7.0.x" + - name: Run Dotnet Restore + run: | + dotnet restore - name: Run Snyk to check for vulnerabilities uses: snyk/actions/dotnet@master env: diff --git a/.github/workflows/secrets-scan.yml b/.github/workflows/secrets-scan.yml deleted file mode 100644 index 1e8f176..0000000 --- a/.github/workflows/secrets-scan.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: Secrets Scan -on: - pull_request: - types: [opened, synchronize, reopened] -jobs: - security: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Gittyleaks - uses: gupy-io/gittyleaks-action@v0.1 \ No newline at end of file From 03c7d792a45c09a05f9e86ae7be34a8569c366c5 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 15:25:05 +0530 Subject: [PATCH 34/83] fix: sca-scan workflow file --- .github/workflows/sca-scan.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 9dfae1c..015f002 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -8,13 +8,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@master - - name: Setup .NET Core @ Latest - uses: actions/setup-dotnet@v1 - with: - dotnet-version: "7.0.x" - - name: Run Dotnet Restore - run: | - dotnet restore - name: Run Snyk to check for vulnerabilities uses: snyk/actions/dotnet@master env: From df7fbf811753acde21184fbfae6f1c5d3076f661 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 15:28:00 +0530 Subject: [PATCH 35/83] fix: sca-scan workflow fix --- .github/workflows/sca-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 015f002..fb625a9 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -13,4 +13,4 @@ jobs: env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} with: - args: --fail-on=all + args: --file=Contentstack.Utils/obj/project.assets.json --fail-on=all From 964be8be835a0b1c08af37aa2128928c2fec0173 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Tue, 12 Mar 2024 17:32:42 +0530 Subject: [PATCH 36/83] Update sca-scan.yml --- .github/workflows/sca-scan.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index fb625a9..65467cf 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -8,9 +8,13 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@master + - name: Setup .NET + uses: actions/setup-dotnet@3.0.3 + - name: Restore dependencies + run: dotnet restore ./Contentstack.Utils.sln - name: Run Snyk to check for vulnerabilities uses: snyk/actions/dotnet@master env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} with: - args: --file=Contentstack.Utils/obj/project.assets.json --fail-on=all + args: --fail-on=all From 497370090f1323fa92c78b2a285d3055da391c42 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Tue, 12 Mar 2024 17:43:33 +0530 Subject: [PATCH 37/83] Update sca-scan.yml --- .github/workflows/sca-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 65467cf..73811da 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -9,7 +9,7 @@ jobs: - name: Checkout repository uses: actions/checkout@master - name: Setup .NET - uses: actions/setup-dotnet@3.0.3 + uses: actions/setup-dotnet@v3.0.3 - name: Restore dependencies run: dotnet restore ./Contentstack.Utils.sln - name: Run Snyk to check for vulnerabilities From cc0e2cc7e85e9e39022d6a0723453ce448ca198e Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Tue, 12 Mar 2024 17:47:15 +0530 Subject: [PATCH 38/83] Update sca-scan.yml --- .github/workflows/sca-scan.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 73811da..6d7078f 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -8,13 +8,12 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@master + - uses: snyk/actions/setup@master - name: Setup .NET uses: actions/setup-dotnet@v3.0.3 - name: Restore dependencies run: dotnet restore ./Contentstack.Utils.sln - name: Run Snyk to check for vulnerabilities - uses: snyk/actions/dotnet@master + run: snyk test --fail-on=all env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} - with: - args: --fail-on=all From cfc8f5f9eaaee827cc38652c0dec5c3e10f6f4b9 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:23:48 +0530 Subject: [PATCH 39/83] Update sca-scan.yml --- .github/workflows/sca-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 6d7078f..be402b2 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -14,6 +14,6 @@ jobs: - name: Restore dependencies run: dotnet restore ./Contentstack.Utils.sln - name: Run Snyk to check for vulnerabilities - run: snyk test --fail-on=all + run: cd Contentstack.Utils && snyk test --fail-on=all env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} From 137c89aa07ecceb787c173ea924c283c7356cfda Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 20:02:32 +0530 Subject: [PATCH 40/83] feat: :sparkles: fragment tag support added --- CHANGELOG.md | 1 + Contentstack.Utils.Tests/DefaultRenderTest.cs | 8 ++++++++ Contentstack.Utils/Models/Options.cs | 2 ++ 3 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 355db18..f9b7376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Version: 1.0.2 #### Date: Mar-14-2024 - Style attributes supported in converted HTML. +- Fragment tag support added ### Version: 1.0.1 #### Date: July-16-2021 diff --git a/Contentstack.Utils.Tests/DefaultRenderTest.cs b/Contentstack.Utils.Tests/DefaultRenderTest.cs index 1751fc8..776f6c9 100644 --- a/Contentstack.Utils.Tests/DefaultRenderTest.cs +++ b/Contentstack.Utils.Tests/DefaultRenderTest.cs @@ -197,6 +197,14 @@ public void testEmbedDocument() Assert.Equal($"", result); } + [Fact] + public void testFragmentDocument() + { + string result = defaultRender.RenderNode("fragment", node, (nodes) => { return text; }); + + Assert.Equal($"{text}", result); + } + [Fact] public void testH1Document() { diff --git a/Contentstack.Utils/Models/Options.cs b/Contentstack.Utils/Models/Options.cs index 2572f46..d8561e7 100644 --- a/Contentstack.Utils/Models/Options.cs +++ b/Contentstack.Utils/Models/Options.cs @@ -135,6 +135,8 @@ public virtual string RenderNode(string nodeType, Node node, NodeChildrenCallBac href = (string)node.attrs["url"]; } return $""; + case "fragment": + return $"{callBack(node.children)}"; case "h1": return $"{callBack(node.children)}"; case "h2": From 368ba0f0cc7bd871f7bf429e09be6a95b372b939 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 12 Mar 2024 20:15:45 +0530 Subject: [PATCH 41/83] feat: older PR changes merge Merging changes of PR: https://github.com/contentstack/contentstack-utils-dotnet/pull/4/files --- .../Constants/JsonToHtmlConstants.cs | 3 +++ .../Contentstack.Utils.Tests.csproj | 10 +++---- Contentstack.Utils.Tests/JsonToHtmlTest.cs | 20 ++++++++++++++ .../Mocks/CustomRenderOptionMock.cs | 14 ++++++++++ Contentstack.Utils/Contentstack.Utils.csproj | 4 +-- SECURITY.md | 27 +++++++++++++++++++ 6 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 SECURITY.md diff --git a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs index a4b7ae6..d4abe37 100644 --- a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs +++ b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs @@ -17,6 +17,8 @@ public static class JsonToHtmlResultConstants public const string kBlockquoteHtml = "
    Praesent eu ex sed nibh venenatis pretium.
    "; public const string kCodeHtml = "Code template."; public const string kLinkInPHtml = "

    LINK

    "; + public const string kLinkInPMailToHtml = "

    LINK

    "; + public const string kLinkInPMailToTARGEtHtml = "

    LINK

    "; public const string kEmbedHtml = ""; } @@ -38,6 +40,7 @@ public static class JsonToHtmlConstants public const string kCodeJson = "{ \"uid\":\"06ea490849d7fc2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"83fba92c91b30002b\",\"type\":\"code\",\"attrs\":{},\"children\":[{\"text\":\"Code template.\"}]}],\"type\":\"doc\"}"; public const string kTableJson = "{ \"uid\": \"06e481190849d7fcd\", \"_version\": 13, \"attrs\": { }, \"children\": [ { \"uid\": \"6dd64343bf634bfadd4\", \"type\": \"table\", \"attrs\": { \"rows\": 4, \"cols\": 2, \"colWidths\": [ 250, 250 ] }, \"children\": [ { \"uid\": \"b9082\", \"type\": \"thead\", \"attrs\": {}, \"children\": [ { \"type\": \"tr\", \"attrs\": {}, \"children\": [ { \"type\": \"th\", \"attrs\": {}, \"children\": [ { \"type\": \"p\", \"attrs\": {}, \"children\": [ { \"text\": \"Header 1\" } ], \"uid\": \"daa3ef\" } ], \"uid\": \"4b3124414a3\" }, { \"type\": \"th\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Header 2\" } ], \"uid\": \"eae83c5797d\" } ], \"uid\": \"bca9b6f037a04fb485\" } ], \"uid\": \"b91ae7a48ef2e9da1\" } ] }, { \"type\": \"tbody\", \"attrs\": { }, \"children\": [ { \"type\": \"tr\", \"attrs\": { }, \"children\": [ { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 1 data 1\" } ], \"uid\": \"ec674ccc5ce70b7cab\" } ], \"uid\": \"2a70bdeeb99a\" }, { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 1 data 2\" } ], \"uid\": \"769a 3f9db34 ce8ec 10486d50\" } ], \"uid\": \"d6407 34a5c6 1ab1e5f7d1\" } ], \"uid\": \"77f6 b951c68 7f9eb397c5\" }, { \"type\": \"tr\", \"attrs\": { }, \"children\": [ { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 2 data 1\" } ], \"uid\": \"a6bf 11bb48 630e87d721c0\" } ], \"uid\": \"3da39838b0feaf\" }, { \"type\": \"td\", \"attrs\": { }, \"children\": [ { \"type\": \"p\", \"attrs\": { }, \"children\": [ { \"text\": \"Body row 2 data 2\" } ], \"uid\": \"3b7d12 1f694202 49029e86313\" } ], \"uid\": \"95b38b04abcbc25e94f\" } ], \"uid\": \"b 227fea 8d247013 4f1e1e8\" } ], \"uid\": \"fd5ab86aa642798451b\" } ] }, ], \"type\": \"doc\" }"; public const string kLinkInPJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"type\":\"p\",\"attrs\":{\"style\":{\"text-align\":\"left\"},\"redactor-attributes\":{ }},\"uid\":\"d88dcdf4590dff2d\",\"children\":[{\"text\":\"\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true},{ \"uid\":\"0d06598201aa8b47\",\"type\":\"a\",\"attrs\":{ \"url\":\"LINK.com\",\"target\":\"_self\"},\"children\":[{ \"text\":\"LINK\"}]},{ \"text\":\"\"}]}],\"type\":\"doc\"}"; + public const string kLinkInPMailToJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"type\":\"p\",\"attrs\":{\"style\":{\"text-align\":\"left\"},\"redactor-attributes\":{ }},\"uid\":\"d88dcdf4590dff2d\",\"children\":[{\"text\":\"\",\"bold\":true,\"italic\":true,\"underline\":true,\"subscript\":true},{ \"uid\":\"0d06598201aa8b47\",\"type\":\"a\",\"attrs\":{ \"url\":\"mailto:support@contentstack.com\",\"target\":\"_self\"},\"children\":[{ \"text\":\"LINK\"}]},{ \"text\":\"\"}]}],\"type\":\"doc\"}"; public const string kEmbedJson = "{ \"uid\":\"06e34a7190849d7f2acd\", \"_version\":13, \"attrs\":{ }, \"children\":[{\"uid\":\"251017315905c35d42c9\",\"type\":\"embed\",\"attrs\":{\"url\":\"https://www.youtube.com/watch?v=AOP0yARiW8U\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; public const string kAssetReferenceJson = "{\"uid\":\"06e34a7 5e4 e549d \", \"_version\":1, \"attrs\":{}, \"children\":[{ \"uid\": \"4f7e33 3390a955 de10c1 c836\", \"type\":\"reference\",\"attrs\":{\"display-type\":\"display\",\"asset-uid\":\"UID_12\",\"content-type-uid\":\"sys_assets\",\"asset-link\":\"https://images.contentstack.com/v3/assets/UID_14/11.jpg\",\"asset-name\":\"11.jpg\",\"asset-type\":\"image/jpeg\",\"type\":\"asset\",\"class-name\":\"embedded-asset\",\"width\":25.16914749661705,\"className\":\"dsd\",\"id\":\"sdf\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; public const string kEntryReferenceBlockJson = "{ \"uid\":\"06e34a7 5e4 e549d \", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"70f9b 325075d43 128c0d0 aa3eb7f291f\",\"type\":\"reference\",\"attrs\":{\"display-type\":\"block\",\"entry-uid\":\"UID_07\",\"content-type-uid\":\"content_block\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; diff --git a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj index 02e6e09..59c0d34 100644 --- a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj +++ b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj @@ -8,14 +8,14 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Contentstack.Utils.Tests/JsonToHtmlTest.cs b/Contentstack.Utils.Tests/JsonToHtmlTest.cs index 6f15636..62c06e9 100644 --- a/Contentstack.Utils.Tests/JsonToHtmlTest.cs +++ b/Contentstack.Utils.Tests/JsonToHtmlTest.cs @@ -170,6 +170,26 @@ public void Should_Return_Result_For_Link_Document() Assert.Equal(JsonToHtmlResultConstants.kLinkInPHtml, result); } + [Fact] + public void Should_Return_Result_For_Link_MailTo_Document() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kLinkInPMailToJson); + + string result = Utils.JsonToHtml(node, defaultRender); + + Assert.Equal(JsonToHtmlResultConstants.kLinkInPMailToHtml, result); + } + + [Fact] + public void Should_Return_Result_For_Link_MailTo_Document_Custom() + { + Node node = NodeParser.parse(JsonToHtmlConstants.kLinkInPMailToJson); + + string result = Utils.JsonToHtml(node, new CustomRenderOptionMock(null)); + + Assert.Equal(JsonToHtmlResultConstants.kLinkInPMailToTARGEtHtml, result); + } + [Fact] public void Should_Return_Result_For_Array_Link_Document() { diff --git a/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs b/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs index b74f0d0..53b37da 100644 --- a/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs +++ b/Contentstack.Utils.Tests/Mocks/CustomRenderOptionMock.cs @@ -10,6 +10,20 @@ public class CustomRenderOptionMock : Options public CustomRenderOptionMock(IEntryEmbedable entry) : base(entry) { } + public override string RenderNode(string nodeType, Node node, NodeChildrenCallBack callBack) + { + switch (nodeType) + { + case "a": + if (node.attrs.ContainsKey("target")) + { + return $"{callBack(node.children)}"; + } + return $"{callBack(node.children)}"; + } + return base.RenderNode(nodeType, node, callBack); + } + public override string RenderOption(IEmbeddedObject embeddedObject, Metadata metadata) { var attributeStringList = new List(); diff --git a/Contentstack.Utils/Contentstack.Utils.csproj b/Contentstack.Utils/Contentstack.Utils.csproj index 311a0cc..b01be4c 100644 --- a/Contentstack.Utils/Contentstack.Utils.csproj +++ b/Contentstack.Utils/Contentstack.Utils.csproj @@ -38,7 +38,7 @@ - - + +
    diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..b5fe070 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,27 @@ +## Security + +Contentstack takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations. + +If you believe you have found a security vulnerability in any Contentstack-owned repository, please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Send email to [security@contentstack.com](mailto:security@contentstack.com). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +[https://www.contentstack.com/trust/](https://www.contentstack.com/trust/) From 071f29378ce1ef7fc72d24d1669b940d78235c4b Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Wed, 13 Mar 2024 18:37:14 +0530 Subject: [PATCH 42/83] Updates LICENSE file --- Contentstack.Utils/LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Contentstack.Utils/LICENSE.txt b/Contentstack.Utils/LICENSE.txt index df79778..3333caa 100644 --- a/Contentstack.Utils/LICENSE.txt +++ b/Contentstack.Utils/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright © 2012-2021 Contentstack. All Rights Reserved +Copyright © 2012-2024 Contentstack. All Rights Reserved Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 0412b96078222b79658efac07b5ea22b2b614d99 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Thu, 14 Mar 2024 13:55:06 +0530 Subject: [PATCH 43/83] fix: test config changes - dotnet version, package updates --- .../Constants/JsonToHtmlConstants.cs | 10 +++++----- .../Contentstack.Utils.Tests.csproj | 13 +++++++------ Contentstack.Utils/Models/Options.cs | 6 ++++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs index d4abe37..061336e 100644 --- a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs +++ b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs @@ -4,21 +4,21 @@ public static class JsonToHtmlResultConstants { public const string kPlainTextHtml = "Aliquam sit amet libero dapibus, eleifend ligula at, varius justoLorem ipsumdolor sit ametconsectetur adipiscing elit.Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. "; public const string kParagraphHtml = "

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum iaculis magna in vehicula. Vestibulum vitae convallis lacus. Praesent a diam iaculis turpis rhoncus faucibus. Aliquam sed pulvinar sem.

    "; - public const string kH1Html = "

    Lorem ipsum dolor sit amet.

    "; + public const string kH1Html = "

    Lorem ipsum dolor sit amet.

    "; public const string kH2Html = "

    Vestibulum a ligula eget massa sagittis aliquam sit amet quis tortor.

    "; public const string kH3Html = "

    Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.

    "; public const string kH4Html = "

    MaNullam feugiat turpis quis elit interdum, vitae laoreet quam viverra

    "; public const string kH5Html = "
    Mauris venenatis dui id massa sollicitudin, non bibendum nunc dictum.
    "; public const string kH6Html = "
    Nunc porta diam vitae purus semper, ut consequat lorem vehicula.
    "; - public const string kOrderListHtml = "
    1. Morbi in quam molestie, fermentum diam vitae, bibendum ipsum.
    2. Pellentesque mattis lacus in quam aliquam congue
    3. Integer feugiat leo dignissim, lobortis enim vitae, mollis lectus.
    4. Sed in ante lacinia, molestie metus eu, fringilla sapien.
    "; + public const string kOrderListHtml = "
    1. Morbi in quam molestie, fermentum diam vitae, bibendum ipsum.
    2. Pellentesque mattis lacus in quam aliquam congue
    3. Integer feugiat leo dignissim, lobortis enim vitae, mollis lectus.
    4. Sed in ante lacinia, molestie metus eu, fringilla sapien.
    "; public const string kIUnorderListHtml = "
    • Sed quis metus sed mi hendrerit mollis vel et odio.
    • Integer vitae sem dignissim, elementum libero vel, fringilla massa.
    • Integer imperdiet arcu sit amet tortor faucibus aliquet.
    • Aenean scelerisque velit vitae dui vehicula, at congue massa sagittis.
    "; public const string kImgHtml = ""; public const string kTableHtml = "

    Header 1

    Header 2

    Body row 1 data 1

    Body row 1 data 2

    Body row 2 data 1

    Body row 2 data 2

    "; public const string kBlockquoteHtml = "
    Praesent eu ex sed nibh venenatis pretium.
    "; public const string kCodeHtml = "Code template."; - public const string kLinkInPHtml = "

    LINK

    "; - public const string kLinkInPMailToHtml = "

    LINK

    "; - public const string kLinkInPMailToTARGEtHtml = "

    LINK

    "; + public const string kLinkInPHtml = "

    LINK

    "; + public const string kLinkInPMailToHtml = "

    LINK

    "; + public const string kLinkInPMailToTARGEtHtml = "

    LINK

    "; public const string kEmbedHtml = ""; } diff --git a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj index 59c0d34..45ab904 100644 --- a/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj +++ b/Contentstack.Utils.Tests/Contentstack.Utils.Tests.csproj @@ -1,21 +1,22 @@ - netstandard2.0;net47;net472; + net7.0 false $(Version) - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Contentstack.Utils/Models/Options.cs b/Contentstack.Utils/Models/Options.cs index d8561e7..9f741ab 100644 --- a/Contentstack.Utils/Models/Options.cs +++ b/Contentstack.Utils/Models/Options.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Contentstack.Utils.Enums; using Contentstack.Utils.Interfaces; +using Newtonsoft.Json.Linq; namespace Contentstack.Utils.Models { @@ -101,9 +102,10 @@ public virtual string RenderNode(string nodeType, Node node, NodeChildrenCallBac { styleAttrs = $" style=\"{styleVal}\""; } - else if (styleVal is IDictionary) + else if (styleVal is JObject) { - var styleDictionary = (IDictionary)styleVal; + var styleObject = (JObject)styleVal; + var styleDictionary = styleObject.ToObject>(); styleAttrs = " style=\""; foreach (var pair in styleDictionary) { From 4f7220e34f1e50a078391afe375d1c6af911a234 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:11:29 +0530 Subject: [PATCH 44/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 458476e..f32c3dc 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -18,7 +18,6 @@ jobs: NUGET_AUTH_TOKEN: ${{ secrets.NUGET_AUTH_TOKEN }} - name: Build solution and generate NuGet package run: | - cd contentstack-utils-dotnet dotnet pack -c Release -o out - name: Push generated package to GitHub registry @@ -38,7 +37,6 @@ jobs: NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build solution and generate NuGet package run: | - cd contentstack-utils-dotnet dotnet pack -c Release -o out - name: Push generated package to GitHub registry From 924bf48ba8ba3d7e0fc16eaaace3f9db6386e6b0 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:17:57 +0530 Subject: [PATCH 45/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index f32c3dc..d320062 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -21,7 +21,7 @@ jobs: dotnet pack -c Release -o out - name: Push generated package to GitHub registry - run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true + run: dotnet nuget push ./out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source https://www.nuget.org/ --skip-duplicate --no-symbols true publish-git: runs-on: windows-latest @@ -40,4 +40,4 @@ jobs: dotnet pack -c Release -o out - name: Push generated package to GitHub registry - run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true + run: dotnet nuget push ./out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true From 0b029fb04db65905dc9f78dff4357f659bf5d3cf Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:44:58 +0530 Subject: [PATCH 46/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index d320062..881e849 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -21,7 +21,7 @@ jobs: dotnet pack -c Release -o out - name: Push generated package to GitHub registry - run: dotnet nuget push ./out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source https://www.nuget.org/ --skip-duplicate --no-symbols true + run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source https://www.nuget.org/ --skip-duplicate --no-symbols true publish-git: runs-on: windows-latest @@ -40,4 +40,4 @@ jobs: dotnet pack -c Release -o out - name: Push generated package to GitHub registry - run: dotnet nuget push ./out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true + run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true From bf846b35940e9b1fbc08642016d577cb07674c4d Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:49:03 +0530 Subject: [PATCH 47/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 881e849..459bd71 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -19,6 +19,7 @@ jobs: - name: Build solution and generate NuGet package run: | dotnet pack -c Release -o out + echo ls - name: Push generated package to GitHub registry run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source https://www.nuget.org/ --skip-duplicate --no-symbols true From 41150b72189b4ac67b12d430d8f08b7428acc541 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:58:33 +0530 Subject: [PATCH 48/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 459bd71..431b124 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -19,10 +19,10 @@ jobs: - name: Build solution and generate NuGet package run: | dotnet pack -c Release -o out - echo ls + ls - name: Push generated package to GitHub registry - run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source https://www.nuget.org/ --skip-duplicate --no-symbols true + run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source "https://www.nuget.org/" --skip-duplicate --no-symbols true publish-git: runs-on: windows-latest From 8bd6541f2c9d6358aa0c786872bf17f7926e4899 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:08:53 +0530 Subject: [PATCH 49/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 431b124..4c13291 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -22,7 +22,7 @@ jobs: ls - name: Push generated package to GitHub registry - run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key $NUGET_AUTH_TOKEN --source "https://www.nuget.org/" --skip-duplicate --no-symbols true + run: dotnet nuget push ./out/*.nupkg --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true --source https://api.nuget.org/v3/index.json publish-git: runs-on: windows-latest @@ -41,4 +41,4 @@ jobs: dotnet pack -c Release -o out - name: Push generated package to GitHub registry - run: dotnet nuget push ./contentstack-utils-dotnet/out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true + run: dotnet nuget push ./out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true From d7b5fa92b3cd9047632253126372dcfbdeafffed Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:13:18 +0530 Subject: [PATCH 50/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 4c13291..0edd644 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -19,10 +19,11 @@ jobs: - name: Build solution and generate NuGet package run: | dotnet pack -c Release -o out - ls - name: Push generated package to GitHub registry - run: dotnet nuget push ./out/*.nupkg --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true --source https://api.nuget.org/v3/index.json + run: | + cd out + dotnet nuget push "contentstack.utils.*.nupkg" --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true --source https://api.nuget.org/v3/index.json publish-git: runs-on: windows-latest @@ -41,4 +42,6 @@ jobs: dotnet pack -c Release -o out - name: Push generated package to GitHub registry - run: dotnet nuget push ./out/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true + run: | + cd out + dotnet nuget push "contentstack.utils.*.nupkg" --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true From 079508ccc2d02d2944568e575ca04fc38d08f729 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:19:24 +0530 Subject: [PATCH 51/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 0edd644..7d3fa85 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -15,7 +15,7 @@ jobs: with: dotnet-version: '3.1.x' env: - NUGET_AUTH_TOKEN: ${{ secrets.NUGET_AUTH_TOKEN }} + NUGET_AUTH_TOKEN: ${{ secrets.NUGET_API_KEY }} - name: Build solution and generate NuGet package run: | dotnet pack -c Release -o out @@ -23,7 +23,7 @@ jobs: - name: Push generated package to GitHub registry run: | cd out - dotnet nuget push "contentstack.utils.*.nupkg" --api-key $NUGET_AUTH_TOKEN --skip-duplicate --no-symbols true --source https://api.nuget.org/v3/index.json + dotnet nuget push "contentstack.utils.*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate --no-symbols true --source https://api.nuget.org/v3/index.json publish-git: runs-on: windows-latest @@ -44,4 +44,4 @@ jobs: - name: Push generated package to GitHub registry run: | cd out - dotnet nuget push "contentstack.utils.*.nupkg" --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate --no-symbols true + dotnet nuget push "contentstack.utils.*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate --no-symbols true From 530811fa3ea6c5a09430da59573fc811dbe589b7 Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:22:44 +0530 Subject: [PATCH 52/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 7d3fa85..3538715 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -11,9 +11,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v1 - name: Setup .NET Core @ Latest - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '3.1.x' + uses: actions/setup-dotnet@v3 env: NUGET_AUTH_TOKEN: ${{ secrets.NUGET_API_KEY }} - name: Build solution and generate NuGet package From 81cd0744f2f120b7d884da72c16ce3d59a531b1b Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:23:25 +0530 Subject: [PATCH 53/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 3538715..82348b5 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -29,9 +29,8 @@ jobs: - name: Checkout repository uses: actions/checkout@v1 - name: Setup .NET Core @ Latest - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v3 with: - dotnet-version: '3.1.x' source-url: https://nuget.pkg.github.com/Contentstack/index.json env: NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From b1a34fc4583fb1f9d4739c5259beb53b4ddf841c Mon Sep 17 00:00:00 2001 From: Nadeem <110535104+nadeem-cs@users.noreply.github.com> Date: Wed, 20 Mar 2024 13:09:52 +0530 Subject: [PATCH 54/83] Update nuget-publish.yml --- .github/workflows/nuget-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nuget-publish.yml b/.github/workflows/nuget-publish.yml index 82348b5..37ef592 100644 --- a/.github/workflows/nuget-publish.yml +++ b/.github/workflows/nuget-publish.yml @@ -41,4 +41,4 @@ jobs: - name: Push generated package to GitHub registry run: | cd out - dotnet nuget push "contentstack.utils.*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate --no-symbols true + dotnet nuget push "contentstack.utils.*.nupkg" --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate --no-symbols true --source https://api.nuget.org/v3/index.json From 275fe9d22399e1d8ff8a821f10d77130e0cccd5b Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Fri, 17 May 2024 21:12:09 +0530 Subject: [PATCH 55/83] sca-scan.yml --- .github/workflows/sca-scan.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index be402b2..4fa4560 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -3,17 +3,13 @@ on: pull_request: types: [opened, synchronize, reopened] jobs: - security: + security-sca: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@master - - uses: snyk/actions/setup@master - - name: Setup .NET - uses: actions/setup-dotnet@v3.0.3 - - name: Restore dependencies - run: dotnet restore ./Contentstack.Utils.sln + - uses: actions/checkout@master - name: Run Snyk to check for vulnerabilities - run: cd Contentstack.Utils && snyk test --fail-on=all + uses: snyk/actions/dotnet@master env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + with: + args: --fail-on=all From 97002337e1ef88675cf6a5eefb92c237880df3f6 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Fri, 17 May 2024 21:12:24 +0530 Subject: [PATCH 56/83] jira.yml --- .github/workflows/jira.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml index 5ddf87a..caa4bbd 100644 --- a/.github/workflows/jira.yml +++ b/.github/workflows/jira.yml @@ -3,7 +3,7 @@ on: pull_request: types: [opened] jobs: - security: + security-jira: if: ${{ github.actor == 'dependabot[bot]' || github.actor == 'snyk-bot' || contains(github.event.pull_request.head.ref, 'snyk-fix-') || contains(github.event.pull_request.head.ref, 'snyk-upgrade-')}} runs-on: ubuntu-latest steps: @@ -26,3 +26,8 @@ jobs: PR: ${{ github.event.pull_request.html_url }} fields: "${{ secrets.JIRA_FIELDS }}" + - name: Transition issue + uses: atlassian/gajira-transition@v3 + with: + issue: ${{ steps.create.outputs.issue }} + transition: ${{ secrets.JIRA_TRANSITION }} From 73a4e01ffecdf913cdfd2dc91b267453cbf170b3 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Fri, 17 May 2024 21:12:25 +0530 Subject: [PATCH 57/83] sast-scan.yml --- .github/workflows/sast-scan.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/workflows/sast-scan.yml diff --git a/.github/workflows/sast-scan.yml b/.github/workflows/sast-scan.yml new file mode 100644 index 0000000..3b9521a --- /dev/null +++ b/.github/workflows/sast-scan.yml @@ -0,0 +1,11 @@ +name: SAST Scan +on: + pull_request: + types: [opened, synchronize, reopened] +jobs: + security-sast: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Semgrep Scan + run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v "${PWD}:/src" returntocorp/semgrep semgrep scan --config auto \ No newline at end of file From 8ffbfecd49e3d5b0d9fff44fb73891b8c58080a3 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Fri, 17 May 2024 21:12:26 +0530 Subject: [PATCH 58/83] codeql-analysis.yml From ef246e6026d5f309866d5819795fe865105be873 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Mon, 27 May 2024 14:45:40 +0530 Subject: [PATCH 59/83] feat: Editable tags function added --- .talismanrc | 2 + .../Interfaces/IEmbeddedObject.cs | 8 ++ Contentstack.Utils/Utils.cs | 89 +++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/.talismanrc b/.talismanrc index bd9bf54..4628b50 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,4 +1,6 @@ fileignoreconfig: - filename: Contentstack.Utils/Models/Options.cs checksum: 3dc51f0de02429ef9a43b66e666ac4dbde41195e245f8ecc0094548ca8603245 +- filename: Contentstack.Utils/Utils.cs + checksum: dfcfa04bedf8e5f9e74f68d02a9f8cb4e35de399e272da015453c6bc4c481e3f version: "" \ No newline at end of file diff --git a/Contentstack.Utils/Interfaces/IEmbeddedObject.cs b/Contentstack.Utils/Interfaces/IEmbeddedObject.cs index 278de5f..8244017 100644 --- a/Contentstack.Utils/Interfaces/IEmbeddedObject.cs +++ b/Contentstack.Utils/Interfaces/IEmbeddedObject.cs @@ -24,6 +24,14 @@ string Title } } + public interface EditableEntry: IEmbeddedEntry + { + + string Locale { get; set; } + + object this[string key] { get; set; } + } + public interface IEmbeddedAsset: IEmbeddedObject { string Title diff --git a/Contentstack.Utils/Utils.cs b/Contentstack.Utils/Utils.cs index 645f8bf..34b6a96 100644 --- a/Contentstack.Utils/Utils.cs +++ b/Contentstack.Utils/Utils.cs @@ -193,5 +193,94 @@ private static IEmbeddedObject findEmbedded(Metadata metadata, List GetTag(object content, string prefix, bool tagsAsObject, string locale) + { + var tags = new Dictionary(); + foreach (var property in (Dictionary)content) + { + var key = property.Key; + var value = property.Value; + + if (key == "$") + continue; + + switch (value) + { + case object obj when obj is object[] array: + for (int index = 0; index < array.Length; index++) + { + object objValue = array[index]; + string childKey = $"{key}__{index}"; + string parentKey = $"{key}__parent"; + + tags[childKey] = GetTagsValue($"{prefix}.{key}.{index}", tagsAsObject); + tags[parentKey] = GetParentTagsValue($"{prefix}.{key}", tagsAsObject); + + if (objValue != null && + objValue.GetType().GetProperty("_content_type_uid") != null && + objValue.GetType().GetProperty("Uid") != null) + { + var typedObj = (EditableEntry)objValue; + string locale_ = Convert.ToString(typedObj.GetType().GetProperty("locale").GetValue(typedObj)); + string ctUid = Convert.ToString(typedObj.GetType().GetProperty("_content_type_uid").GetValue(typedObj)); + string uid = Convert.ToString(typedObj.GetType().GetProperty("uid").GetValue(typedObj)); + string localeStr = ""; + if (locale_ != null) + { + localeStr = locale_; + } else + { + localeStr = locale; + } + typedObj["$"] = GetTag(typedObj, $"{ctUid}.{uid}.{localeStr}", tagsAsObject, locale); + } + else if (value is object) + { + ((EditableEntry)value)["$"] = GetTag(value, $"{prefix}.{key}.{index}", tagsAsObject, locale); + } + } + tags[key] = GetTagsValue($"{prefix}.{key}", tagsAsObject); + break; + case object obj when obj != null: + if (value != null) + { + ((EditableEntry)value)["$"] = GetTag(value, $"{prefix}.{key}", tagsAsObject, locale); + } + break; + } + } + return tags; + } + + private static object GetTagsValue(string dataValue, bool tagsAsObject) + { + if (tagsAsObject) + { + return new Dictionary { { "data-cslp", dataValue } }; + } + else + { + return $"data-cslp={dataValue}"; + } + } + + private static object GetParentTagsValue(string dataValue, bool tagsAsObject) + { + if (tagsAsObject) + { + return new Dictionary { { "data-cslp-parent-field", dataValue } }; + } + else + { + return $"data-cslp-parent-field={dataValue}"; + } + } } } From 31bdf6b39c39e194bbe536d671360b159edd8249 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 9 Jul 2024 15:07:59 +0530 Subject: [PATCH 60/83] chore: version bump --- CHANGELOG.md | 4 ++++ Directory.Build.props | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9b7376..766d318 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ +### Version: 1.0.3 +#### Date: Jul-10-2024 +- Editable tags added + ### Version: 1.0.2 #### Date: Mar-14-2024 - Style attributes supported in converted HTML. diff --git a/Directory.Build.props b/Directory.Build.props index 4f93bc6..80b11f8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 1.0.2 + 1.0.3 From 8ea40dbd8ece40cc66d83ccc7e124a776f2db8c0 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Tue, 9 Jul 2024 15:18:41 +0530 Subject: [PATCH 61/83] Update sca-scan.yml --- .github/workflows/sca-scan.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 4fa4560..a642aef 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -6,10 +6,14 @@ jobs: security-sca: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - name: Checkout repository + uses: actions/checkout@master + - uses: snyk/actions/setup@master + - name: Setup .NET + uses: actions/setup-dotnet@v3.0.3 + - name: Restore dependencies + run: dotnet restore ./Contentstack.Utils.sln - name: Run Snyk to check for vulnerabilities - uses: snyk/actions/dotnet@master + run: cd Contentstack.Utils && snyk test --fail-on=all env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} - with: - args: --fail-on=all From 219a5adee46b3106162d72faa7e23386d0316d71 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 13 Aug 2024 20:32:52 +0530 Subject: [PATCH 62/83] feat: :sparkles: classname and id property support added in TextNode --- CHANGELOG.md | 4 ++++ Contentstack.Utils.sln | 2 +- Contentstack.Utils/Models/TextNode.cs | 2 ++ Directory.Build.props | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 766d318..4d6f68e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ +### Version: 1.0.4 +#### Date: Aug-21-2024 +- Classname and ID property support in text node + ### Version: 1.0.3 #### Date: Jul-10-2024 - Editable tags added diff --git a/Contentstack.Utils.sln b/Contentstack.Utils.sln index 5356759..85e4cc7 100644 --- a/Contentstack.Utils.sln +++ b/Contentstack.Utils.sln @@ -21,7 +21,7 @@ Global {EB2B5E23-E45F-4C6C-BF98-FE3971DE4250}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - version = 1.0.2 + version = 1.0.4 Policies = $0 $0.DotNetNamingPolicy = $1 $1.DirectoryNamespaceAssociation = PrefixedHierarchical diff --git a/Contentstack.Utils/Models/TextNode.cs b/Contentstack.Utils/Models/TextNode.cs index 4933a1e..bb86a87 100644 --- a/Contentstack.Utils/Models/TextNode.cs +++ b/Contentstack.Utils/Models/TextNode.cs @@ -10,6 +10,8 @@ public class TextNode: Node public bool inlineCode { get; set; } public bool subscript { get; set; } public bool superscript { get; set; } + public string classname { get; set; } + public string id { get; set; } public string text { get; set; } } } diff --git a/Directory.Build.props b/Directory.Build.props index 80b11f8..d5c9309 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 1.0.3 + 1.0.4 From dbc30d83cb69a1ec80d4cd8c3d2ecd354f0a1b6f Mon Sep 17 00:00:00 2001 From: raj pandey Date: Wed, 9 Oct 2024 14:42:51 +0530 Subject: [PATCH 63/83] used the className and id property and version bump --- CHANGELOG.md | 4 ++++ .../Constants/JsonToHtmlConstants.cs | 5 +++-- Contentstack.Utils.Tests/JsonToHtmlTest.cs | 10 ++++++++++ Contentstack.Utils.sln | 2 +- Contentstack.Utils/Enums/MarkType.cs | 12 ++++++++++-- Contentstack.Utils/Interfaces/IOptions.cs | 2 +- Contentstack.Utils/Models/Options.cs | 7 ++++++- Contentstack.Utils/Utils.cs | 4 ++++ Directory.Build.props | 2 +- 9 files changed, 40 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d6f68e..5bd0842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ +### Version: 1.0.5 +#### Date: Oct-10-2024 +- Used Class Name and Id property in JsonToHTML converter + ### Version: 1.0.4 #### Date: Aug-21-2024 - Classname and ID property support in text node diff --git a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs index 061336e..09d6761 100644 --- a/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs +++ b/Contentstack.Utils.Tests/Constants/JsonToHtmlConstants.cs @@ -20,6 +20,7 @@ public static class JsonToHtmlResultConstants public const string kLinkInPMailToHtml = "

    LINK

    "; public const string kLinkInPMailToTARGEtHtml = "

    LINK

    "; public const string kEmbedHtml = ""; + public const string stringClassIdResult = "

    This is a text to be ignored

    " ; } public static class JsonToHtmlConstants @@ -47,8 +48,8 @@ public static class JsonToHtmlConstants public const string kEntryReferenceLinkJson = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"7626ea98e0e95d602210\",\"type\":\"reference\",\"attrs\":{\"target\":\"_self\",\"href\":\"/copy-of-entry-final-02\",\"display-type\":\"link\",\"entry-uid\":\"UID_08\",\"content-type-uid\":\"embeddedrte\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"/copy-of-entry-final-02\"}]}],\"type\":\"doc\"}"; public const string kEntryReferenceInlineJson = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"506 4878f3f46 s21f0cbc aff\",\"type\":\"reference\",\"attrs\":{\"display-type\":\"inline\",\"entry-uid\":\"UID_09\",\"content-type-uid\":\"embeddedrte\",\"locale\":\"en-us\",\"type\":\"entry\",\"class-name\":\"embedded-entry\"},\"children\":[{\"text\":\"\"}]}],\"type\":\"doc\"}"; public const string kHRJson = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"f5a7b57 40a8a5c3 576828276b\",\"type\":\"hr\",\"children\":[{\"text\":\"\"}],\"attrs\":{ }}],\"type\":\"doc\"}"; - - + public const string classId = "{ \"uid\":\"06e34a7 5e4 e549d\", \"_version\":1, \"attrs\":{ }, \"children\":[{\"uid\":\"f5a7b57 40a8a5c3 576828276b\",\"type\":\"doc\",\"children\":[{\"text\":\"Thorisbest\",\"classname\": \"c2\",\"id\": \"i2\"}],\"attrs\":{ }}],\"type\":\"text\"}"; + public const string stringClassId = "{ \"type\": \"doc\", \"attrs\": {}, \"uid\": \"8622288a91dc4c76985d776d2540b395\", \"children\": [ { \"type\": \"p\", \"uid\": \"396ee25abd0f4296a45eac63809450ef\", \"attrs\": {}, \"children\": [ { \"text\": \"This\", \"classname\": \"\", \"id\": \"i3\" }, { \"text\": \" is a \" }, { \"text\": \"text\", \"classname\": \"c1\", \"id\": \"i1\" }, { \"text\": \" to be \" }, { \"text\": \"ignored\", \"classname\": \"c2\", \"id\": \"\" } ] } ], \"_version\": 4 }"; public const string KAssetNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"system\": { \"content_type_uid\": \"sys_assets\", \"uid\": \"UID_12\" }, \"created_at\": \"2020-08-19T09:13:32.785Z\", \"updated_at\": \"2020-08-19T09:13:32.785Z\", \"created_by\": \"Created_at\", \"updated_by\": \"Created_at\", \"content_type\": \"application/pdf\", \"file_size\": \"13264\", \"filename\": \"dummy.pdf\", \"url\":\"/v3/assetsUID_12/dummy.pdf\", \"_version\": 1, \"title\": \"dummy.pdf\" } } ]}"; public const string KEntryBlocNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"title\": \"Update this title\", \"url\": \"\", \"locale\": \"en-us\", \"system\": { \"uid\": \"UID_07\", \"content_type_uid\": \"content_block\" }, \"_version\": 5, \"_in_progress\": false, \"multi_line\": \"\", \"rich_text_editor\": \"\" } } ]}"; public const string KEntryLinkNode = "\"embedded_itemsConnection\": { \"edges\": [{ \"node\": { \"title\": \"Entry with embedded entry\", \"rich_text_editor\": [ \"\" ], \"locale\": \"en-us\", \"system\": { \"uid\": \"UID_08\", \"content_type_uid\": \"embeddedrte\" }, \"_in_progress\": false } } ]}"; diff --git a/Contentstack.Utils.Tests/JsonToHtmlTest.cs b/Contentstack.Utils.Tests/JsonToHtmlTest.cs index 62c06e9..9f4b4e1 100644 --- a/Contentstack.Utils.Tests/JsonToHtmlTest.cs +++ b/Contentstack.Utils.Tests/JsonToHtmlTest.cs @@ -479,5 +479,15 @@ public void Should_Return_Result_For_Array_Hr_Document() Assert.Equal(new List() { "
    " }, result); } + + [Fact] + public void TestForClassandId() + { + Node node = NodeParser.parse(JsonToHtmlConstants.stringClassId); + + var result = Utils.JsonToHtml(new List() { node }, defaultRender); + + Assert.Equal(new List() { JsonToHtmlResultConstants.stringClassIdResult }, result); + } } } diff --git a/Contentstack.Utils.sln b/Contentstack.Utils.sln index 85e4cc7..12afb40 100644 --- a/Contentstack.Utils.sln +++ b/Contentstack.Utils.sln @@ -21,7 +21,7 @@ Global {EB2B5E23-E45F-4C6C-BF98-FE3971DE4250}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - version = 1.0.4 + version = 1.0.5 Policies = $0 $0.DotNetNamingPolicy = $1 $1.DirectoryNamespaceAssociation = PrefixedHierarchical diff --git a/Contentstack.Utils/Enums/MarkType.cs b/Contentstack.Utils/Enums/MarkType.cs index 11ff58a..cf828f9 100644 --- a/Contentstack.Utils/Enums/MarkType.cs +++ b/Contentstack.Utils/Enums/MarkType.cs @@ -30,6 +30,14 @@ public enum MarkType /// /// This will specify the Mark type of text node as Superscript /// - Superscript - } + Superscript, + /// + /// This will specify the Mark type of text node as Superscript + /// + Class, + /// + /// This will specify the Mark type of text node as Superscript + /// + Id +} } diff --git a/Contentstack.Utils/Interfaces/IOptions.cs b/Contentstack.Utils/Interfaces/IOptions.cs index 6ea9f90..1cccd09 100644 --- a/Contentstack.Utils/Interfaces/IOptions.cs +++ b/Contentstack.Utils/Interfaces/IOptions.cs @@ -10,7 +10,7 @@ namespace Contentstack.Utils.Interfaces public interface IRenderable { string RenderOption(IEmbeddedObject entry, Metadata metadata); - string RenderMark(MarkType markType, string text); + string RenderMark(MarkType markType, string text, string className, string Id); string RenderNode(string nodeType, Node node, NodeChildrenCallBack callBack); } } diff --git a/Contentstack.Utils/Models/Options.cs b/Contentstack.Utils/Models/Options.cs index 9f741ab..7cab2fc 100644 --- a/Contentstack.Utils/Models/Options.cs +++ b/Contentstack.Utils/Models/Options.cs @@ -66,7 +66,7 @@ public virtual string RenderOption(IEmbeddedObject embeddedObject, Metadata meta return ""; } - public virtual string RenderMark(MarkType markType, string text) + public virtual string RenderMark(MarkType markType, string text, string className = "", string id = "") { switch (markType) { @@ -84,6 +84,11 @@ public virtual string RenderMark(MarkType markType, string text) return $"{text}"; case MarkType.Superscript: return $"{text}"; + case MarkType.Id: + case MarkType.Class: + string classAttr = !string.IsNullOrEmpty(className) ? $" class=\"{className}\"" : ""; + string idAttr = !string.IsNullOrEmpty(id) ? $" id=\"{id}\"" : ""; + return $"{text}
    "; } return text; } diff --git a/Contentstack.Utils/Utils.cs b/Contentstack.Utils/Utils.cs index 34b6a96..81f4c00 100644 --- a/Contentstack.Utils/Utils.cs +++ b/Contentstack.Utils/Utils.cs @@ -159,6 +159,10 @@ private static string textToHtml(TextNode textNode, Options options) { text = options.RenderMark(MarkType.Bold, text: text); } + if (!string.IsNullOrEmpty(textNode.classname) || !string.IsNullOrEmpty(textNode.id)) + { + text = options.RenderMark(MarkType.Class, text: text, textNode.classname, textNode.id); + } return text; } diff --git a/Directory.Build.props b/Directory.Build.props index d5c9309..18f9aae 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 1.0.4 + 1.0.5 From 116d1ce57c39e49b21d38b2183a56f7ab90a497d Mon Sep 17 00:00:00 2001 From: raj pandey Date: Wed, 9 Oct 2024 14:43:05 +0530 Subject: [PATCH 64/83] update marktype --- Contentstack.Utils/Enums/MarkType.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Contentstack.Utils/Enums/MarkType.cs b/Contentstack.Utils/Enums/MarkType.cs index cf828f9..4180f65 100644 --- a/Contentstack.Utils/Enums/MarkType.cs +++ b/Contentstack.Utils/Enums/MarkType.cs @@ -31,12 +31,12 @@ public enum MarkType /// This will specify the Mark type of text node as Superscript /// Superscript, - /// - /// This will specify the Mark type of text node as Superscript - /// + /// + /// This will specify the class selector + /// Class, - /// - /// This will specify the Mark type of text node as Superscript + /// + /// This will specify the id selector /// Id } From 57ad3b0456d12041024f4a6d8dfc9536783a1b93 Mon Sep 17 00:00:00 2001 From: raj pandey Date: Wed, 9 Oct 2024 16:24:00 +0530 Subject: [PATCH 65/83] workflow update --- .github/workflows/check-branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-branch.yml b/.github/workflows/check-branch.yml index 1e2d24a..68eda98 100644 --- a/.github/workflows/check-branch.yml +++ b/.github/workflows/check-branch.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Comment PR - if: github.base_ref == 'master' && github.head_ref != 'next' + if: github.base_ref == 'master' && github.head_ref != 'staging' uses: thollander/actions-comment-pull-request@v2 with: message: | From 08cb5d6d47c8b27f6a537e8b4a546d0a4fc6caa1 Mon Sep 17 00:00:00 2001 From: raj pandey Date: Wed, 9 Oct 2024 16:48:26 +0530 Subject: [PATCH 66/83] fixed the workflow issue for PR raising --- .github/workflows/check-branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-branch.yml b/.github/workflows/check-branch.yml index 68eda98..e79864e 100644 --- a/.github/workflows/check-branch.yml +++ b/.github/workflows/check-branch.yml @@ -14,7 +14,7 @@ jobs: message: | We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the next branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch. - name: Check branch - if: github.base_ref == 'master' && github.head_ref != 'next' + if: github.base_ref == 'master' && github.head_ref != 'staging' run: | echo "ERROR: We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the next branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch." exit 1 \ No newline at end of file From 8a477bd49611fdbaa78df60afadae974fbce5123 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 20 Jan 2025 12:28:10 +0530 Subject: [PATCH 67/83] sca-scan.yml --- .github/workflows/sca-scan.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index a642aef..4fa4560 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -6,14 +6,10 @@ jobs: security-sca: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@master - - uses: snyk/actions/setup@master - - name: Setup .NET - uses: actions/setup-dotnet@v3.0.3 - - name: Restore dependencies - run: dotnet restore ./Contentstack.Utils.sln + - uses: actions/checkout@master - name: Run Snyk to check for vulnerabilities - run: cd Contentstack.Utils && snyk test --fail-on=all + uses: snyk/actions/dotnet@master env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} + with: + args: --fail-on=all From 859fbca96cb827e4a4255c0a1a51f20ab25b83a5 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 20 Jan 2025 12:28:22 +0530 Subject: [PATCH 68/83] jira.yml --- .github/workflows/jira.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml index caa4bbd..250abc7 100644 --- a/.github/workflows/jira.yml +++ b/.github/workflows/jira.yml @@ -21,7 +21,7 @@ jobs: project: ${{ secrets.JIRA_PROJECT }} issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} summary: | - ${{ github.event.pull_request.title }} + Snyk | Vulnerability | ${{ github.event.repository.name }} | ${{ github.event.pull_request.title }} description: | PR: ${{ github.event.pull_request.html_url }} From 78a2b45ccf4acd5db6a436cb938d8ef32ec07137 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 20 Jan 2025 12:28:23 +0530 Subject: [PATCH 69/83] sast-scan.yml From eb23349e6adea3dbdd7bdb07394e59819e3ec8d5 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 20 Jan 2025 12:28:25 +0530 Subject: [PATCH 70/83] codeql-analysis.yml From a71223f0312f4451e97b7ae13ec440b6dfb7889e Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 20 Jan 2025 12:28:29 +0530 Subject: [PATCH 71/83] Updated codeowners --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 0773923..1be7e0d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @contentstack/security-admin \ No newline at end of file +* @contentstack/security-admin From 46ee79e41b67140492c25bd69828128c909daf2e Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 16 Apr 2025 10:55:26 +0530 Subject: [PATCH 72/83] policy-scan.yml --- .github/workflows/policy-scan.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/policy-scan.yml diff --git a/.github/workflows/policy-scan.yml b/.github/workflows/policy-scan.yml new file mode 100644 index 0000000..13bd362 --- /dev/null +++ b/.github/workflows/policy-scan.yml @@ -0,0 +1,27 @@ +name: Checks the security policy and configurations +on: + pull_request: + types: [opened, synchronize, reopened] +jobs: + security-policy: + if: github.event.repository.visibility == 'public' + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@master + - name: Checks for SECURITY.md policy file + run: | + if ! [[ -f "SECURITY.md" || -f ".github/SECURITY.md" ]]; then exit 1; fi + security-license: + if: github.event.repository.visibility == 'public' + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@master + - name: Checks for License file + run: | + if ! [[ -f "LICENSE" || -f "License.txt" || -f "LICENSE.md" ]]; then exit 1; fi \ No newline at end of file From 61e81a58b2215edf7ccb52d77e1502bdc8fa5261 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 16 Apr 2025 10:55:38 +0530 Subject: [PATCH 73/83] issues-jira.yml --- .github/workflows/issues-jira.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/issues-jira.yml diff --git a/.github/workflows/issues-jira.yml b/.github/workflows/issues-jira.yml new file mode 100644 index 0000000..7bf0469 --- /dev/null +++ b/.github/workflows/issues-jira.yml @@ -0,0 +1,31 @@ +name: Create Jira Ticket for Github Issue + +on: + issues: + types: [opened] + +jobs: + issue-jira: + runs-on: ubuntu-latest + steps: + + - name: Login to Jira + uses: atlassian/gajira-login@master + env: + JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} + JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} + JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} + + - name: Create Jira Issue + id: create_jira + uses: atlassian/gajira-create@master + with: + project: ${{ secrets.JIRA_PROJECT }} + issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} + summary: Github | Issue | ${{ github.event.repository.name }} | ${{ github.event.issue.title }} + description: | + *GitHub Issue:* ${{ github.event.issue.html_url }} + + *Description:* + ${{ github.event.issue.body }} + fields: "${{ secrets.ISSUES_JIRA_FIELDS }}" \ No newline at end of file From cc7f02412afa474385165db8a3de3fba6041c37a Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 16 Apr 2025 10:55:39 +0530 Subject: [PATCH 74/83] Delete jira.yml --- .github/workflows/jira.yml | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 .github/workflows/jira.yml diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml deleted file mode 100644 index 250abc7..0000000 --- a/.github/workflows/jira.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Create JIRA ISSUE -on: - pull_request: - types: [opened] -jobs: - security-jira: - if: ${{ github.actor == 'dependabot[bot]' || github.actor == 'snyk-bot' || contains(github.event.pull_request.head.ref, 'snyk-fix-') || contains(github.event.pull_request.head.ref, 'snyk-upgrade-')}} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Login into JIRA - uses: atlassian/gajira-login@master - env: - JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} - JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} - JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} - - name: Create a JIRA Issue - id: create - uses: atlassian/gajira-create@master - with: - project: ${{ secrets.JIRA_PROJECT }} - issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} - summary: | - Snyk | Vulnerability | ${{ github.event.repository.name }} | ${{ github.event.pull_request.title }} - description: | - PR: ${{ github.event.pull_request.html_url }} - - fields: "${{ secrets.JIRA_FIELDS }}" - - name: Transition issue - uses: atlassian/gajira-transition@v3 - with: - issue: ${{ steps.create.outputs.issue }} - transition: ${{ secrets.JIRA_TRANSITION }} From 406bedf51c16bbc1e148ef7fbedb44fabc0892e6 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 16 Apr 2025 10:55:39 +0530 Subject: [PATCH 75/83] Delete sast-scan.yml --- .github/workflows/sast-scan.yml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .github/workflows/sast-scan.yml diff --git a/.github/workflows/sast-scan.yml b/.github/workflows/sast-scan.yml deleted file mode 100644 index 3b9521a..0000000 --- a/.github/workflows/sast-scan.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: SAST Scan -on: - pull_request: - types: [opened, synchronize, reopened] -jobs: - security-sast: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Semgrep Scan - run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v "${PWD}:/src" returntocorp/semgrep semgrep scan --config auto \ No newline at end of file From c422d6a542a1df0bdd94394f3300767978fd61f3 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 16 Apr 2025 10:55:41 +0530 Subject: [PATCH 76/83] codeql-analysis.yml From 8430c8fdb3f02ffc3c728fab644abe8793d6cf6b Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 16 Apr 2025 10:55:44 +0530 Subject: [PATCH 77/83] Updated codeowners From 6c232ea6c0376ceeba908c4f3be0a2351629791f Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Wed, 23 Apr 2025 21:43:00 +0530 Subject: [PATCH 78/83] policy-scan.yml --- .github/workflows/policy-scan.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/policy-scan.yml b/.github/workflows/policy-scan.yml index 13bd362..ff25923 100644 --- a/.github/workflows/policy-scan.yml +++ b/.github/workflows/policy-scan.yml @@ -24,4 +24,23 @@ jobs: - uses: actions/checkout@master - name: Checks for License file run: | - if ! [[ -f "LICENSE" || -f "License.txt" || -f "LICENSE.md" ]]; then exit 1; fi \ No newline at end of file + expected_license_files=("LICENSE" "LICENSE.txt" "LICENSE.md" "License.txt") + license_file_found=false + current_year=$(date +"%Y") + + for license_file in "${expected_license_files[@]}"; do + if [ -f "$license_file" ]; then + license_file_found=true + # check the license file for the current year, if not exists, exit with error + if ! grep -q "$current_year" "$license_file"; then + echo "License file $license_file does not contain the current year." + exit 2 + fi + break + fi + done + + if [ "$license_file_found" = false ]; then + echo "No license file found. Please add a license file to the repository." + exit 1 + fi \ No newline at end of file From 46c55b40bf60138475386937dac2fe8a408b3b21 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 5 May 2025 22:16:20 +0530 Subject: [PATCH 79/83] policy-scan.yml From 91e010ce8a49f78fa7fed10d6e6e9d1a2bdd78f1 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 5 May 2025 22:16:28 +0530 Subject: [PATCH 80/83] issues-jira.yml From 5e3c8277a1dc21c64fe03d40cd4d1e6536200d41 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 5 May 2025 22:16:28 +0530 Subject: [PATCH 81/83] secrets-scan.yml --- .github/workflows/secrets-scan.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/secrets-scan.yml diff --git a/.github/workflows/secrets-scan.yml b/.github/workflows/secrets-scan.yml new file mode 100644 index 0000000..049c02f --- /dev/null +++ b/.github/workflows/secrets-scan.yml @@ -0,0 +1,29 @@ +name: Secrets Scan +on: + pull_request: + types: [opened, synchronize, reopened] +jobs: + security-secrets: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: '2' + ref: '${{ github.event.pull_request.head.ref }}' + - run: | + git reset --soft HEAD~1 + - name: Install Talisman + run: | + # Download Talisman + wget https://github.com/thoughtworks/talisman/releases/download/v1.37.0/talisman_linux_amd64 -O talisman + + # Checksum verification + checksum=$(sha256sum ./talisman | awk '{print $1}') + if [ "$checksum" != "8e0ae8bb7b160bf10c4fa1448beb04a32a35e63505b3dddff74a092bccaaa7e4" ]; then exit 1; fi + + # Make it executable + chmod +x talisman + - name: Run talisman + run: | + # Run Talisman with the pre-commit hook + ./talisman --githook pre-commit \ No newline at end of file From 31480388744b76c5cebabe929fbb7a33c37e065b Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 5 May 2025 22:16:32 +0530 Subject: [PATCH 82/83] Updated codeowners From 9e9ee2a19e9faac678a8485c415c5317088f8c05 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Mon, 5 May 2025 23:37:17 +0530 Subject: [PATCH 83/83] talismanrc file updated --- .talismanrc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.talismanrc b/.talismanrc index 4628b50..f94199e 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,4 +1,7 @@ fileignoreconfig: +- filename: .github/workflows/secrets-scan.yml + ignore_detectors: + - filecontent - filename: Contentstack.Utils/Models/Options.cs checksum: 3dc51f0de02429ef9a43b66e666ac4dbde41195e245f8ecc0094548ca8603245 - filename: Contentstack.Utils/Utils.cs