From cea3812c03ec939c2265e29e0af9e18ea4ca75f8 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Wed, 11 Sep 2019 17:40:23 -0700 Subject: [PATCH 1/7] SHIBUI-1391 First pass of regex validation. --- .../admin/ui/SeleniumSIDETest.groovy | 1 + .../integration/resources/SHIBUI-1391.side | 712 ++++++++++++++++++ 2 files changed, 713 insertions(+) create mode 100644 backend/src/integration/resources/SHIBUI-1391.side diff --git a/backend/src/integration/groovy/edu/internet2/tier/shibboleth/admin/ui/SeleniumSIDETest.groovy b/backend/src/integration/groovy/edu/internet2/tier/shibboleth/admin/ui/SeleniumSIDETest.groovy index 9d80460a4..51b35a461 100644 --- a/backend/src/integration/groovy/edu/internet2/tier/shibboleth/admin/ui/SeleniumSIDETest.groovy +++ b/backend/src/integration/groovy/edu/internet2/tier/shibboleth/admin/ui/SeleniumSIDETest.groovy @@ -103,6 +103,7 @@ class SeleniumSIDETest extends Specification { 'SHIBUI-1361: Verify dates display in proper format' | '/SHIBUI-1361.side' 'SHIBUI-1385: Restore a metadata source version' | '/SHIBUI-1385-1.side' 'SHIBUI-1385: Restore a metadata provider version' | '/SHIBUI-1385-2.side' + 'SHIBUI-1391: Regex Validation' | '/SHIBUI-1391.side' } } diff --git a/backend/src/integration/resources/SHIBUI-1391.side b/backend/src/integration/resources/SHIBUI-1391.side new file mode 100644 index 000000000..fd08ffbaa --- /dev/null +++ b/backend/src/integration/resources/SHIBUI-1391.side @@ -0,0 +1,712 @@ +{ + "id": "57bde36d-15e6-4364-b117-4fb36e1e4941", + "version": "2.0", + "name": "SHIBUI-1391", + "url": "http://localhost:10101", + "tests": [{ + "id": "d87336f9-5279-422f-bf4d-73403f34fc85", + "name": "SHIBUI-1391", + "commands": [{ + "id": "2f6aa07a-6a16-439f-8c16-9822163c7b61", + "comment": "", + "command": "open", + "target": "/login", + "targets": [], + "value": "" + }, { + "id": "f1c7d7be-3f12-43f3-8646-ba7294416beb", + "comment": "", + "command": "type", + "target": "name=username", + "targets": [ + ["name=username", "name"], + ["css=tr:nth-child(1) input", "css:finder"], + ["xpath=//input[@name='username']", "xpath:attributes"], + ["xpath=//input", "xpath:position"] + ], + "value": "admin" + }, { + "id": "f293afde-ce8a-4b85-9a19-fb77f21df988", + "comment": "", + "command": "type", + "target": "name=password", + "targets": [ + ["name=password", "name"], + ["css=tr:nth-child(2) input", "css:finder"], + ["xpath=//input[@name='password']", "xpath:attributes"], + ["xpath=//tr[2]/td[2]/input", "xpath:position"] + ], + "value": "adminpass" + }, { + "id": "358c31ea-fab8-4709-9b25-d9e5e82e123c", + "comment": "", + "command": "click", + "target": "name=submit", + "targets": [ + ["name=submit", "name"], + ["css=td:nth-child(1) > input", "css:finder"], + ["xpath=//input[@name='submit']", "xpath:attributes"], + ["xpath=//tr[3]/td/input", "xpath:position"] + ], + "value": "" + }, { + "id": "fdea3214-f0e0-4f13-9d5d-e07ef92d71f1", + "comment": "", + "command": "click", + "target": "css=#addNewDropdown", + "targets": [ + ["css=#addNewDropdown > translate-i18n", "css:finder"], + ["xpath=//button[@id='addNewDropdown']/translate-i18n", "xpath:idRelative"], + ["xpath=//translate-i18n", "xpath:position"], + ["xpath=//translate-i18n[contains(.,'Add New')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "2c40ac99-5e92-4c1c-923a-5a6100cadf43", + "comment": "", + "command": "click", + "target": "linkText=Metadata Provider", + "targets": [ + ["linkText=Metadata Provider", "linkText"], + ["css=.nav-link:nth-child(2)", "css:finder"], + ["xpath=//div[@id='navbar']/ul/li/div/a[2]", "xpath:idRelative"], + ["xpath=(//a[contains(@href, '')])[3]", "xpath:href"], + ["xpath=//a[2]", "xpath:position"] + ], + "value": "" + }, { + "id": "7a42de04-995f-45aa-ba3f-095900a564ec", + "comment": "", + "command": "waitForElementVisible", + "target": "id=/name", + "targets": [], + "value": "10000" + }, { + "id": "b2725ef6-b394-4f87-a2a5-031be085cedb", + "comment": "", + "command": "type", + "target": "id=/name", + "targets": [ + ["id=/name", "id"], + ["name=field4", "name"], + ["css=#\\/name", "css:finder"], + ["xpath=//input[@id='/name']", "xpath:attributes"], + ["xpath=//input", "xpath:position"] + ], + "value": "File Backed HTTP Metadata Provider" + }, { + "id": "ca36b018-a4df-43d1-9fbd-973d6653d3e0", + "comment": "", + "command": "select", + "target": "id=/type", + "targets": [ + ["id=/type", "id"], + ["name=field2", "name"], + ["css=#\\/type", "css:finder"], + ["xpath=//select[@id='/type']", "xpath:attributes"], + ["xpath=//select", "xpath:position"] + ], + "value": "label=FileBackedHttpMetadataProvider" + }, { + "id": "e5d1d696-3029-4f9d-ad53-2e60b4789935", + "comment": "", + "command": "click", + "target": "css=.next", + "targets": [ + ["css=.next", "css:finder"], + ["xpath=//li[2]/button", "xpath:position"] + ], + "value": "" + }, { + "id": "352f066f-c2af-4735-81b1-5440ba7a3432", + "comment": "", + "command": "waitForElementVisible", + "target": "id=/xmlId", + "targets": [], + "value": "10000" + }, { + "id": "e7462621-f4e4-4512-b200-20afa5685fc6", + "comment": "", + "command": "type", + "target": "id=/xmlId", + "targets": [ + ["id=/xmlId", "id"], + ["name=field7", "name"], + ["css=#\\/xmlId", "css:finder"], + ["xpath=//input[@id='/xmlId']", "xpath:attributes"], + ["xpath=//input", "xpath:position"] + ], + "value": "12345" + }, { + "id": "7bfaa2a7-c66d-4e36-b1f4-1de30b02ebd0", + "comment": "", + "command": "type", + "target": "id=/metadataURL", + "targets": [ + ["id=/metadataURL", "id"], + ["name=field8", "name"], + ["css=#\\/metadataURL", "css:finder"], + ["xpath=//input[@id='/metadataURL']", "xpath:attributes"], + ["xpath=//div[2]/sf-form-element/div/sf-widget-chooser/custom-string/div/input", "xpath:position"] + ], + "value": "https://idp.unicon.net/idp/shibboleth" + }, { + "id": "047e1ea4-e28c-4b1b-86fc-ff19a3c0efcc", + "comment": "", + "command": "click", + "target": "id=/initializeFromBackupFile.false", + "targets": [ + ["id=/initializeFromBackupFile.false", "id"], + ["css=#\\/initializeFromBackupFile\\.false", "css:finder"], + ["xpath=//input[@id='/initializeFromBackupFile.false']", "xpath:attributes"], + ["xpath=//div[2]/label/input", "xpath:position"] + ], + "value": "" + }, { + "id": "34124b74-7b90-424a-9219-1f0bfbf06b70", + "comment": "", + "command": "type", + "target": "id=/backingFile", + "targets": [ + ["id=/backingFile", "id"], + ["name=field10", "name"], + ["css=#\\/backingFile", "css:finder"], + ["xpath=//input[@id='/backingFile']", "xpath:attributes"], + ["xpath=//div[4]/sf-form-element/div/sf-widget-chooser/custom-string/div/input", "xpath:position"] + ], + "value": "%{idp.home}/foo.txt" + }, { + "id": "0668032d-608b-4a01-9ac8-e4e2ac058294", + "comment": "", + "command": "click", + "target": "css=.btn-outline-secondary", + "targets": [ + ["css=.btn-outline-secondary", "css:finder"], + ["xpath=(//button[@type='button'])[2]", "xpath:attributes"], + ["xpath=//div[@id='/backupFileInitNextRefreshDelay-container']/div/div/button", "xpath:idRelative"], + ["xpath=//div/button", "xpath:position"], + ["xpath=//button[contains(.,'Toggle Dropdown')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "5aa1d849-42b9-45e8-ac74-d3df1f9458db", + "comment": "", + "command": "waitForElementVisible", + "target": "id=/backupFileInitNextRefreshDelay__option--1", + "targets": [], + "value": "10000" + }, { + "id": "35dfa0f8-c0f2-4356-a6b0-18b5dc35337b", + "comment": "", + "command": "click", + "target": "id=/backupFileInitNextRefreshDelay__option--1", + "targets": [ + ["id=/backupFileInitNextRefreshDelay__option--1", "id"], + ["css=#\\/backupFileInitNextRefreshDelay__option--1", "css:finder"], + ["xpath=//li[@id='/backupFileInitNextRefreshDelay__option--1']", "xpath:attributes"], + ["xpath=//ul[@id='/backupFileInitNextRefreshDelay__listbox']/li[2]", "xpath:idRelative"], + ["xpath=//auto-complete/div/ul/li[2]", "xpath:position"], + ["xpath=//li[contains(.,'PT30S')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "b4d0a551-3bc1-466f-b204-ec7164af44ec", + "comment": "", + "command": "click", + "target": "id=/failFastInitialization.false", + "targets": [ + ["id=/failFastInitialization.false", "id"], + ["css=#\\/failFastInitialization\\.false", "css:finder"], + ["xpath=//input[@id='/failFastInitialization.false']", "xpath:attributes"], + ["xpath=//div[7]/sf-form-element/div/sf-widget-chooser/boolean-radio/div/div[2]/label/input", "xpath:position"] + ], + "value": "" + }, { + "id": "bef80dbb-25a6-4381-8b0e-331faaeb4392", + "comment": "", + "command": "click", + "target": "id=/satisfyAnyPredicates.true", + "targets": [ + ["id=/satisfyAnyPredicates.true", "id"], + ["css=#\\/satisfyAnyPredicates\\.true", "css:finder"], + ["xpath=//input[@id='/satisfyAnyPredicates.true']", "xpath:attributes"], + ["xpath=//div[9]/sf-form-element/div/sf-widget-chooser/boolean-radio/div/div/label/input", "xpath:position"] + ], + "value": "" + }, { + "id": "d0af8425-5f4c-4037-a549-52553b828179", + "comment": "", + "command": "pause", + "target": "1000", + "targets": [], + "value": "" + }, { + "id": "9fe532ee-4ce6-4ff8-ab6c-ea92eb527ded", + "comment": "", + "command": "click", + "target": "css=.next", + "targets": [ + ["css=.next", "css:finder"], + ["xpath=//li[3]/button", "xpath:position"] + ], + "value": "" + }, { + "id": "44e705a1-f284-4303-a0b6-c4bc9896c78d", + "comment": "", + "command": "pause", + "target": "1000", + "targets": [], + "value": "" + }, { + "id": "824b4515-ae14-436e-a56f-d631ea9e1edc", + "comment": "", + "command": "click", + "target": "css=#\\/reloadableMetadataResolverAttributes\\/minRefreshDelay-container .btn", + "targets": [ + ["css=#\\/reloadableMetadataResolverAttributes\\/minRefreshDelay-container .btn", "css:finder"], + ["xpath=(//button[@type='button'])[2]", "xpath:attributes"], + ["xpath=//div[@id='/reloadableMetadataResolverAttributes/minRefreshDelay-container']/div/div/button", "xpath:idRelative"], + ["xpath=//div/button", "xpath:position"], + ["xpath=//button[contains(.,'Toggle Dropdown')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "9ee7065a-823e-4b4a-b212-0582eeaf7a00", + "comment": "", + "command": "click", + "target": "id=/reloadableMetadataResolverAttributes/minRefreshDelay__option--0", + "targets": [ + ["id=/reloadableMetadataResolverAttributes/minRefreshDelay__option--0", "id"], + ["css=#\\/reloadableMetadataResolverAttributes\\/minRefreshDelay__option--0", "css:finder"], + ["xpath=//li[@id='/reloadableMetadataResolverAttributes/minRefreshDelay__option--0']", "xpath:attributes"], + ["xpath=//ul[@id='/reloadableMetadataResolverAttributes/minRefreshDelay__listbox']/li", "xpath:idRelative"], + ["xpath=//auto-complete/div/ul/li", "xpath:position"], + ["xpath=//li[contains(.,'PT0S')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "618cc5f1-417b-4bc6-9388-3238f2304904", + "comment": "", + "command": "click", + "target": "css=#\\/reloadableMetadataResolverAttributes\\/maxRefreshDelay-container .btn", + "targets": [ + ["css=#\\/reloadableMetadataResolverAttributes\\/maxRefreshDelay-container .btn", "css:finder"], + ["xpath=(//button[@type='button'])[3]", "xpath:attributes"], + ["xpath=//div[@id='/reloadableMetadataResolverAttributes/maxRefreshDelay-container']/div/div/button", "xpath:idRelative"], + ["xpath=//div[2]/sf-form-element/div/sf-widget-chooser/datalist-component/div/auto-complete/div/div/div/button", "xpath:position"] + ], + "value": "" + }, { + "id": "a89f1b4d-10bd-48f7-9b97-865710cfe01f", + "comment": "", + "command": "click", + "target": "id=/reloadableMetadataResolverAttributes/maxRefreshDelay__option--2", + "targets": [ + ["id=/reloadableMetadataResolverAttributes/maxRefreshDelay__option--2", "id"], + ["css=#\\/reloadableMetadataResolverAttributes\\/maxRefreshDelay__option--2", "css:finder"], + ["xpath=//li[@id='/reloadableMetadataResolverAttributes/maxRefreshDelay__option--2']", "xpath:attributes"], + ["xpath=//ul[@id='/reloadableMetadataResolverAttributes/maxRefreshDelay__listbox']/li[3]", "xpath:idRelative"], + ["xpath=//div[2]/sf-form-element/div/sf-widget-chooser/datalist-component/div/auto-complete/div/ul/li[3]", "xpath:position"] + ], + "value": "" + }, { + "id": "143b781c-56ae-48c6-a7f5-8c93953f6095", + "comment": "", + "command": "click", + "target": "id=/reloadableMetadataResolverAttributes/refreshDelayFactor", + "targets": [ + ["id=/reloadableMetadataResolverAttributes/refreshDelayFactor", "id"], + ["name=field20", "name"], + ["css=#\\/reloadableMetadataResolverAttributes\\/refreshDelayFactor", "css:finder"], + ["xpath=//input[@id='/reloadableMetadataResolverAttributes/refreshDelayFactor']", "xpath:attributes"], + ["xpath=//custom-string/div/input", "xpath:position"] + ], + "value": "" + }, { + "id": "dcd01c7a-f733-4977-9cc2-e9084903e079", + "comment": "", + "command": "type", + "target": "id=/reloadableMetadataResolverAttributes/refreshDelayFactor", + "targets": [ + ["id=/reloadableMetadataResolverAttributes/refreshDelayFactor", "id"], + ["name=field20", "name"], + ["css=#\\/reloadableMetadataResolverAttributes\\/refreshDelayFactor", "css:finder"], + ["xpath=//input[@id='/reloadableMetadataResolverAttributes/refreshDelayFactor']", "xpath:attributes"], + ["xpath=//custom-string/div/input", "xpath:position"] + ], + "value": "0.5" + }, { + "id": "b7522094-c53a-4e79-8c7c-e38a3b2615f4", + "comment": "", + "command": "click", + "target": "css=.next", + "targets": [ + ["css=.next", "css:finder"], + ["xpath=//li[3]/button", "xpath:position"] + ], + "value": "" + }, { + "id": "363af92e-0327-47b9-918c-1560adab40cc", + "comment": "", + "command": "click", + "target": "css=.btn-outline-secondary", + "targets": [ + ["css=.btn-outline-secondary", "css:finder"], + ["xpath=(//button[@type='button'])[2]", "xpath:attributes"], + ["xpath=//div[@id='/metadataFilters/RequiredValidUntil/maxValidityInterval-container']/div/div/button", "xpath:idRelative"], + ["xpath=//div/button", "xpath:position"], + ["xpath=//button[contains(.,'Toggle Dropdown')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "a4470d6f-04a7-4c4b-8c1e-70cff2f35e8a", + "comment": "", + "command": "click", + "target": "id=/metadataFilters/RequiredValidUntil/maxValidityInterval__option--1", + "targets": [ + ["id=/metadataFilters/RequiredValidUntil/maxValidityInterval__option--1", "id"], + ["css=#\\/metadataFilters\\/RequiredValidUntil\\/maxValidityInterval__option--1", "css:finder"], + ["xpath=//li[@id='/metadataFilters/RequiredValidUntil/maxValidityInterval__option--1']", "xpath:attributes"], + ["xpath=//ul[@id='/metadataFilters/RequiredValidUntil/maxValidityInterval__listbox']/li[2]", "xpath:idRelative"], + ["xpath=//auto-complete/div/ul/li[2]", "xpath:position"], + ["xpath=//li[contains(.,'P14D')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "4530c1b4-8f27-4272-9633-c792a3a54f90", + "comment": "", + "command": "click", + "target": "css=#\\/metadataFilters\\/SignatureValidation\\/requireSignedRoot\\.parent > .custom-control-label", + "targets": [ + ["css=#\\/metadataFilters\\/SignatureValidation\\/requireSignedRoot\\.parent > .custom-control-label", "css:finder"], + ["xpath=//div[@id='/metadataFilters/SignatureValidation/requireSignedRoot.parent']/label", "xpath:idRelative"], + ["xpath=//div/div/label", "xpath:position"], + ["xpath=//label[contains(.,'Require Signed Root')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "10cd8cee-fc6a-4e5b-a11b-a7b0a9338f5d", + "comment": "", + "command": "type", + "target": "id=/metadataFilters/SignatureValidation/certificateFile", + "targets": [ + ["id=/metadataFilters/SignatureValidation/certificateFile", "id"], + ["name=field27", "name"], + ["css=#\\/metadataFilters\\/SignatureValidation\\/certificateFile", "css:finder"], + ["xpath=//input[@id='/metadataFilters/SignatureValidation/certificateFile']", "xpath:attributes"], + ["xpath=//custom-string/div/input", "xpath:position"] + ], + "value": "%{idp.home}/foo2.txt" + }, { + "id": "a3ce889f-0607-4071-bd39-25b169c30114", + "comment": "", + "command": "click", + "target": "css=div:nth-child(3) > sf-form-element .bg-light", + "targets": [ + ["css=div:nth-child(3) > sf-form-element .bg-light", "css:finder"], + ["xpath=//div[3]/sf-form-element/div/sf-widget-chooser/fieldset-object/div/div/fieldset/div", "xpath:position"] + ], + "value": "" + }, { + "id": "f205ec23-b433-44bb-af80-e72330b4c7a3", + "comment": "", + "command": "click", + "target": "css=.fa-plus", + "targets": [ + ["css=.fa-plus", "css:finder"], + ["xpath=//array-component/div/div/button/i", "xpath:position"] + ], + "value": "" + }, { + "id": "4dae6914-ae68-45e2-b332-cc4c1ac71e43", + "comment": "", + "command": "select", + "target": "id=/metadataFilters/EntityRoleWhiteList/retainedRoles/0", + "targets": [], + "value": "label=SPSSODescriptor" + }, { + "id": "4b257d69-1948-4c5f-a88d-b1bfa8f2ba72", + "comment": "", + "command": "click", + "target": "css=option:nth-child(2)", + "targets": [ + ["css=option:nth-child(2)", "css:finder"], + ["xpath=//option[@value='1: md:SPSSODescriptor']", "xpath:attributes"], + ["xpath=//select[@id='/metadataFilters/EntityRoleWhiteList/retainedRoles/0']/option[2]", "xpath:idRelative"], + ["xpath=//option[2]", "xpath:position"], + ["xpath=//option[contains(.,'SPSSODescriptor')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "d47fc8b5-4062-4813-90a8-cdc91b777f1d", + "comment": "", + "command": "click", + "target": "css=.btn-success", + "targets": [ + ["css=.btn-success > translate-i18n", "css:finder"], + ["xpath=//div/button/translate-i18n", "xpath:position"] + ], + "value": "" + }, { + "id": "442c5b8d-f108-488e-8779-06171f5081f6", + "comment": "", + "command": "select", + "target": "id=/metadataFilters/EntityRoleWhiteList/retainedRoles/1", + "targets": [], + "value": "label=AttributeAuthorityDescriptor" + }, { + "id": "42eddc22-9eed-41d1-aaee-2d4a1d933fa9", + "comment": "", + "command": "click", + "target": "css=#\\/metadataFilters\\/EntityRoleWhiteList\\/retainedRoles\\/1 > option:nth-child(3)", + "targets": [ + ["css=#\\/metadataFilters\\/EntityRoleWhiteList\\/retainedRoles\\/1 > option:nth-child(3)", "css:finder"], + ["xpath=(//option[@value='2: md:AttributeAuthorityDescriptor'])[2]", "xpath:attributes"], + ["xpath=//select[@id='/metadataFilters/EntityRoleWhiteList/retainedRoles/1']/option[3]", "xpath:idRelative"], + ["xpath=//li[2]/div/sf-form-element/div/sf-widget-chooser/select-component/div/select/option[3]", "xpath:position"] + ], + "value": "" + }, { + "id": "4ebbc08c-ee24-43d8-8c2d-b639a625189c", + "comment": "", + "command": "click", + "target": "css=#\\/metadataFilters\\/EntityRoleWhiteList\\/removeRolelessEntityDescriptors\\.parent > .custom-control-label", + "targets": [ + ["css=#\\/metadataFilters\\/EntityRoleWhiteList\\/removeRolelessEntityDescriptors\\.parent > .custom-control-label", "css:finder"], + ["xpath=//div[@id='/metadataFilters/EntityRoleWhiteList/removeRolelessEntityDescriptors.parent']/label", "xpath:idRelative"], + ["xpath=//div[2]/sf-form-element/div/sf-widget-chooser/checkbox-component/div/div/div/label", "xpath:position"], + ["xpath=//label[contains(.,'Remove Roleless Entity Descriptors?')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "1c23c527-46e7-4fe6-8f60-37833af073c8", + "comment": "", + "command": "click", + "target": "css=#\\/metadataFilters\\/EntityRoleWhiteList\\/removeEmptyEntitiesDescriptors\\.parent > .custom-control-label", + "targets": [ + ["css=#\\/metadataFilters\\/EntityRoleWhiteList\\/removeEmptyEntitiesDescriptors\\.parent > .custom-control-label", "css:finder"], + ["xpath=//div[@id='/metadataFilters/EntityRoleWhiteList/removeEmptyEntitiesDescriptors.parent']/label", "xpath:idRelative"], + ["xpath=//div[3]/sf-form-element/div/sf-widget-chooser/checkbox-component/div/div/div/label", "xpath:position"], + ["xpath=//label[contains(.,'Remove Empty Entities Descriptors?')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "ee3d0257-56e2-402d-8fef-c21c8e62b9fe", + "comment": "", + "command": "click", + "target": "css=.next", + "targets": [ + ["css=.next", "css:finder"], + ["xpath=//li[3]/button", "xpath:position"] + ], + "value": "" + }, { + "id": "7cd861ea-d86c-4faa-a07b-c1508811b506", + "comment": "", + "command": "click", + "target": "css=.custom-control-label", + "targets": [ + ["css=.custom-control-label", "css:finder"], + ["xpath=//div[@id='/enabled.parent']/label", "xpath:idRelative"], + ["xpath=//label", "xpath:position"], + ["xpath=//label[contains(.,'Enable this service?')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "0c112a41-8feb-42da-a58b-8fc04e9a3bf6", + "comment": "", + "command": "click", + "target": "css=.save", + "targets": [ + ["css=.save", "css:finder"], + ["xpath=//li[3]/button", "xpath:position"] + ], + "value": "" + }, { + "id": "12673aa7-fc4e-4877-9842-a9d88dbc2d97", + "comment": "", + "command": "click", + "target": "linkText=File Backed HTTP Metadata Provider", + "targets": [ + ["linkText=File Backed HTTP Metadata Provider", "linkText"], + ["css=td > a", "css:finder"], + ["xpath=//a[contains(text(),'File Backed HTTP Metadata Provider')]", "xpath:link"], + ["xpath=//a[contains(@href, '/metadata/provider/da22a0b7-40d7-418c-bbe9-7ba4c37d3905/configuration/options')]", "xpath:href"], + ["xpath=//td[2]/a", "xpath:position"], + ["xpath=//a[contains(.,'File Backed HTTP Metadata Provider')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "daa2d46a-d238-4a48-aca7-0f34c9b93d5f", + "comment": "", + "command": "click", + "target": "css=.btn:nth-child(2) > translate-i18n", + "targets": [ + ["css=.btn:nth-child(2) > translate-i18n", "css:finder"], + ["xpath=//div[@id='navigation']/div/button/translate-i18n", "xpath:idRelative"], + ["xpath=//div/button/translate-i18n", "xpath:position"], + ["xpath=//translate-i18n[contains(.,'Filters')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "d86e9a98-a0a1-4696-b454-1bca1d01f9d0", + "comment": "", + "command": "click", + "target": "css=#filters .actions span", + "targets": [ + ["css=#filters .actions span", "css:finder"], + ["xpath=//div[@id='filters']/div/div/a/span", "xpath:idRelative"], + ["xpath=//div/a/span", "xpath:position"], + ["xpath=//span[contains(.,'Add Filter')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "dc41b26d-b101-4ead-866f-482df0bfee04", + "comment": "", + "command": "select", + "target": "name=type", + "targets": [], + "value": "label=EntityAttributes" + }, { + "id": "49fe7508-4f42-4eae-a47d-85a0983efb64", + "comment": "", + "command": "click", + "target": "css=option:nth-child(2)", + "targets": [ + ["css=option:nth-child(2)", "css:finder"], + ["xpath=//option[@value='EntityAttributes']", "xpath:attributes"], + ["xpath=//option[2]", "xpath:position"], + ["xpath=//option[contains(.,'EntityAttributes')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "8a52ad88-b583-41b7-92a6-bdb185b03a06", + "comment": "", + "command": "waitForElementVisible", + "target": "id=/name", + "targets": [], + "value": "10000" + }, { + "id": "b1c779b1-d3ed-47cc-bc88-e5c280161c32", + "comment": "", + "command": "type", + "target": "id=/name", + "targets": [ + ["id=/name", "id"], + ["name=field37", "name"], + ["css=#\\/name", "css:finder"], + ["xpath=//input[@id='/name']", "xpath:attributes"], + ["xpath=//input", "xpath:position"] + ], + "value": "Entity Attributes Filter" + }, { + "id": "9ac14c43-206b-4a60-8e58-c4ce64efa2c8", + "comment": "", + "command": "pause", + "target": "2000", + "targets": [], + "value": "" + }, { + "id": "a10a6faf-90cd-4713-8ea3-60c768ed935e", + "comment": "", + "command": "click", + "target": "id=/entityAttributesFilterTarget.valuedd", + "targets": [ + ["id=/entityAttributesFilterTarget.valuedd", "id"], + ["css=#\\/entityAttributesFilterTarget\\.valuedd", "css:finder"], + ["xpath=//button[@id='/entityAttributesFilterTarget.valuedd']", "xpath:attributes"], + ["xpath=//fieldset/div/div/div/div/button", "xpath:position"], + ["xpath=//button[contains(.,'Entity ID')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "1f54a508-0b40-4dc0-b6e0-706971fb19bf", + "comment": "", + "command": "pause", + "target": "2000", + "targets": [], + "value": "" + }, { + "id": "1f2b93b8-23ae-4a9c-b015-96ca890ae150", + "comment": "", + "command": "click", + "target": "linkText=Regex", + "targets": [ + ["linkText=Regex", "linkText"], + ["css=.dropdown-item:nth-child(2)", "css:finder"], + ["xpath=//a[contains(text(),'Regex')]", "xpath:link"], + ["xpath=(//a[contains(@href, '#')])[2]", "xpath:href"], + ["xpath=//div/div/a[2]", "xpath:position"], + ["xpath=//a[contains(.,'Regex')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "b2a41370-db61-4bae-a5f7-a8c5e852e15e", + "comment": "", + "command": "pause", + "target": "2000", + "targets": [], + "value": "" + }, { + "id": "5c2ed93d-3630-408c-bb89-0b2baffb73c0", + "comment": "", + "command": "click", + "target": "id=/entityAttributesFilterTarget.target", + "targets": [ + ["id=/entityAttributesFilterTarget.target", "id"], + ["name=script", "name"], + ["css=#\\/entityAttributesFilterTarget\\.target", "css:finder"], + ["xpath=//input[@id='/entityAttributesFilterTarget.target']", "xpath:attributes"], + ["xpath=//div/div/input", "xpath:position"] + ], + "value": "" + }, { + "id": "66601358-e37c-417b-a174-827037d56969", + "comment": "", + "command": "type", + "target": "id=/entityAttributesFilterTarget.target", + "targets": [ + ["id=/entityAttributesFilterTarget.target", "id"], + ["name=script", "name"], + ["css=#\\/entityAttributesFilterTarget\\.target", "css:finder"], + ["xpath=//input[@id='/entityAttributesFilterTarget.target']", "xpath:attributes"], + ["xpath=//div/div/input", "xpath:position"] + ], + "value": "*" + }, { + "id": "f4a74feb-0372-4452-a085-64ae37a059cb", + "comment": "", + "command": "assertText", + "target": "css=.form-text", + "targets": [ + ["css=.form-text > translate-i18n", "css:finder"], + ["xpath=//small/translate-i18n", "xpath:position"], + ["xpath=//translate-i18n[contains(.,'Invalid Regular Expression')]", "xpath:innerText"] + ], + "value": "Invalid Regular Expression" + }, { + "id": "0280c7b8-5714-43b8-89cc-f1260037bd44", + "comment": "", + "command": "type", + "target": "id=/entityAttributesFilterTarget.target", + "targets": [ + ["id=/entityAttributesFilterTarget.target", "id"], + ["name=script", "name"], + ["css=#\\/entityAttributesFilterTarget\\.target", "css:finder"], + ["xpath=//input[@id='/entityAttributesFilterTarget.target']", "xpath:attributes"], + ["xpath=//div/div/input", "xpath:position"] + ], + "value": ".*/" + }] + }], + "suites": [{ + "id": "248ba015-77cd-430f-b973-d14fd4f39a27", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["d87336f9-5279-422f-bf4d-73403f34fc85"] + }], + "urls": ["http://localhost:10101/"], + "plugins": [] +} \ No newline at end of file From 8f47d89e6ca857eaae7ce989a44fcb47f4407aff Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Tue, 17 Sep 2019 14:42:38 -0700 Subject: [PATCH 2/7] SHIBUI-1391 Added simple regex validation test. --- backend/src/integration/resources/SHIBUI-1391.side | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/integration/resources/SHIBUI-1391.side b/backend/src/integration/resources/SHIBUI-1391.side index fd08ffbaa..54e9abafe 100644 --- a/backend/src/integration/resources/SHIBUI-1391.side +++ b/backend/src/integration/resources/SHIBUI-1391.side @@ -677,11 +677,11 @@ "id": "f4a74feb-0372-4452-a085-64ae37a059cb", "comment": "", "command": "assertText", - "target": "css=.form-text", + "target": "css=.form-text:nth-child(2)", "targets": [ - ["css=.form-text > translate-i18n", "css:finder"], - ["xpath=//small/translate-i18n", "xpath:position"], - ["xpath=//translate-i18n[contains(.,'Invalid Regular Expression')]", "xpath:innerText"] + ["css=.form-text:nth-child(2)", "css:finder"], + ["xpath=//div/div/small", "xpath:position"], + ["xpath=//small[contains(.,'Invalid Regular Expression')]", "xpath:innerText"] ], "value": "Invalid Regular Expression" }, { @@ -696,7 +696,7 @@ ["xpath=//input[@id='/entityAttributesFilterTarget.target']", "xpath:attributes"], ["xpath=//div/div/input", "xpath:position"] ], - "value": ".*/" + "value": ".*" }] }], "suites": [{ From 464844370fbc142bb94f2c9aa384519bf2921d4c Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Wed, 18 Sep 2019 17:22:45 -0400 Subject: [PATCH 3/7] SHIBUI-1500 --- ...lerVersionEndpointsIntegrationTests.groovy | 18 +++++++++++++++ .../controller/MetadataFiltersController.java | 4 +++- .../ui/domain/resolvers/MetadataResolver.java | 6 +++++ ...taFiltersControllerIntegrationTests.groovy | 23 ++++++++++++++++++- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy index aaa0a1095..2c02ee4b4 100644 --- a/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy +++ b/backend/src/enversTest/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolverControllerVersionEndpointsIntegrationTests.groovy @@ -2,6 +2,7 @@ package edu.internet2.tier.shibboleth.admin.ui.controller import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver @@ -136,6 +137,23 @@ class MetadataResolverControllerVersionEndpointsIntegrationTests extends Specifi noExceptionThrown() } + def "SHIBUI-1500"() { + MetadataResolver mr = new FileBackedHttpMetadataResolver(name: 'shibui-1500') + mr = repository.save(mr) + + when: 'add a filter' + def filter = new EntityRoleWhiteListFilter(name: 'shibui-1500', retainedRoles: ['role1']) + mr.addFilter(filter) + mr = repository.save(mr) + + def allVersions = getAllMetadataResolverVersions(mr.resourceId, List) + def mrv1 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[0].id, MetadataResolver) + def mrv2 = getMetadataResolverForVersion(mr.resourceId, allVersions.body[1].id, MetadataResolver) + + then: + (mrv1.getBody() as MetadataResolver).modifiedDate < (mrv2.getBody() as MetadataResolver).modifiedDate + } + private getAllMetadataResolverVersions(String resourceId, responseType) { this.restTemplate.getForEntity(resourceUriFor(ALL_VERSIONS_URI, resourceId), responseType) } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java index cbf5051ba..b640f6362 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java @@ -80,7 +80,7 @@ public ResponseEntity getOne(@PathVariable String metadataResolverId, @PathVa @PostMapping("/Filters") public ResponseEntity create(@PathVariable String metadataResolverId, @RequestBody MetadataFilter createdFilter) { MetadataResolver metadataResolver = findResolverOrThrowHttp404(metadataResolverId); - metadataResolver.getMetadataFilters().add(createdFilter); + metadataResolver.addFilter(createdFilter); MetadataResolver persistedMr = repository.save(metadataResolver); // we reload the filters here after save @@ -153,6 +153,8 @@ public ResponseEntity delete(@PathVariable String metadataResolverId, throw HTTP_404_CLIENT_ERROR_EXCEPTION.get(); } resolver.setMetadataFilters(updatedFilters); + //To support envers versioning from MetadataResolver side + resolver.markAsModified(); repository.save(resolver); filterRepository.delete(filterToDelete); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index dc30d40d8..9e67a5549 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -91,6 +91,12 @@ public int getVersion() { return this.hashCode(); } + public void addFilter(MetadataFilter metadataFilter) { + //To make sure that Spring Data auditing infrastructure recognizes update and "touched" modifiedDate + markAsModified(); + this.metadataFilters.add(metadataFilter); + } + public void markAsModified() { this.versionModifiedTimestamp = System.currentTimeMillis(); } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy index 206421f49..098e7ac2b 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerIntegrationTests.groovy @@ -188,6 +188,27 @@ class MetadataFiltersControllerIntegrationTests extends Specification { resolverResult_3.body.metadataFilters.size == 5 } + def "POST new Filter updates resolver's modifiedDate - SHIBUI-1500"() { + given: 'MetadataResolver with attached entity attributes is available in data store' + def resolver = generator.buildRandomMetadataResolverOfType('FileBacked') + def filter = generator.entityAttributesFilter() + def resolverResourceId = resolver.resourceId + metadataResolverRepository.save(resolver) + MetadataResolver openSamlRepresentation = metadataResolverConverterService.convertToOpenSamlRepresentation(resolver) + OpenSamlChainingMetadataResolverUtil.updateChainingMetadataResolver((OpenSamlChainingMetadataResolver) chainingMetadataResolver, openSamlRepresentation) + + when: 'Resolver without filter is fetched' + def result = this.restTemplate.getForEntity("$BASE_URI/$resolverResourceId", String) + def originalModifiedDate = jsonSlurper.parseText(result.body).modifiedDate + + and: 'POST call is made with new filter' + result = restTemplate.postForEntity("$BASE_URI/$resolverResourceId/Filters", filter, String) + def afterFilterAddedModifiedDate = jsonSlurper.parseText(result.body).modifiedDate + + then: + originalModifiedDate < afterFilterAddedModifiedDate + } + private HttpEntity createRequestHttpEntityFor(Closure jsonBodySupplier) { new HttpEntity(jsonBodySupplier(), ['Content-Type': 'application/json'] as HttpHeaders) } @@ -203,4 +224,4 @@ class MetadataFiltersControllerIntegrationTests extends Specification { } } } -} \ No newline at end of file +} From 643da2c7a1411e9ed8afd288cb28d4ec0e9224cc Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 19 Sep 2019 15:56:24 -0700 Subject: [PATCH 4/7] SHIBUI-1505 Commented out the integratioTest / Selenium section. --- Jenkinsfile | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d19cae2ac..bde811fb4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,23 +17,24 @@ pipeline { } } - stage('Run Selenium tests') { - when { - expression { - return (GIT_BRANCH.startsWith('PR') || GIT_BRANCH.endsWith('-QA')) - } - } - steps { - sh ''' - ./gradlew integrationTest -Dselenium.host=jenkins - ''' - } - post { - always { - junit 'backend/build/test-results/integrationTest/**/*.xml' - } - } - } +# Commented out, for the time being, per SHIBUI-1505 +# stage('Run Selenium tests') { +# when { +# expression { +# return (GIT_BRANCH.startsWith('PR') || GIT_BRANCH.endsWith('-QA')) +# } +# } +# steps { +# sh ''' +# ./gradlew integrationTest -Dselenium.host=jenkins +# ''' +# } +# post { +# always { +# junit 'backend/build/test-results/integrationTest/**/*.xml' +# } +# } +# } stage('Build Docker images') { when { From 4f1748d8752782d5edb23ef09678a7d9170c2ae4 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 19 Sep 2019 16:00:43 -0700 Subject: [PATCH 5/7] SHIBUI-1505 Updated comment format to hopefully be accurate this time. --- Jenkinsfile | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bde811fb4..0c3b7a279 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,25 +17,25 @@ pipeline { } } -# Commented out, for the time being, per SHIBUI-1505 -# stage('Run Selenium tests') { -# when { -# expression { -# return (GIT_BRANCH.startsWith('PR') || GIT_BRANCH.endsWith('-QA')) -# } -# } -# steps { -# sh ''' -# ./gradlew integrationTest -Dselenium.host=jenkins -# ''' -# } -# post { -# always { -# junit 'backend/build/test-results/integrationTest/**/*.xml' -# } -# } -# } - +/* Commented out, for the time being, per SHIBUI-1505 + stage('Run Selenium tests') { + when { + expression { + return (GIT_BRANCH.startsWith('PR') || GIT_BRANCH.endsWith('-QA')) + } + } + steps { + sh ''' + ./gradlew integrationTest -Dselenium.host=jenkins + ''' + } + post { + always { + junit 'backend/build/test-results/integrationTest/**/*.xml' + } + } + } +*/ stage('Build Docker images') { when { expression { From 8b3d2f5e0ab150da5c96cd812ff6fb2b65952860 Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 19 Sep 2019 16:05:54 -0700 Subject: [PATCH 6/7] SHIBUI-1505 Another comment fix. --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0c3b7a279..1eadd28b3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -31,7 +31,7 @@ pipeline { } post { always { - junit 'backend/build/test-results/integrationTest/**/*.xml' +// junit 'backend/build/test-results/integrationTest/**/*.xml' } } } From 18b01ec63c6dcca56fa973dacf199a25ffc6a6ba Mon Sep 17 00:00:00 2001 From: Bill Smith Date: Thu, 19 Sep 2019 16:07:23 -0700 Subject: [PATCH 7/7] SHIBUI-1505 You win, Jenkins. --- Jenkinsfile | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1eadd28b3..56a4ea3f5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,25 +17,6 @@ pipeline { } } -/* Commented out, for the time being, per SHIBUI-1505 - stage('Run Selenium tests') { - when { - expression { - return (GIT_BRANCH.startsWith('PR') || GIT_BRANCH.endsWith('-QA')) - } - } - steps { - sh ''' - ./gradlew integrationTest -Dselenium.host=jenkins - ''' - } - post { - always { -// junit 'backend/build/test-results/integrationTest/**/*.xml' - } - } - } -*/ stage('Build Docker images') { when { expression {