From e182007f0b608732a1d5c44c99afdbaf4653b82f Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Tue, 29 Jun 2021 22:14:59 +0100
Subject: [PATCH] Issue #3174107 by brianperry, mglaman, mtift, alexpott,
 mradcliffe, ravi.shankar, capysara, cathwaldron, kostyashupenko, mherchel: 
 Add additional testing coverage for Olivero

---
 .../config/install/comment.type.comment.yml   |   7 +
 ...contact.form.olivero_test_contact_form.yml |  11 ++
 ...y_form_display.comment.comment.default.yml |  33 ++++
 ...sage.olivero_test_contact_form.default.yml |  56 ++++++
 ...tity_form_display.node.article.default.yml | 106 ++++++++++++
 ...y_view_display.comment.comment.default.yml |  24 +++
 ...tity_view_display.node.article.default.yml |  60 +++++++
 ...e.entity_view_display.node.article.rss.yml |  25 +++
 ...ntity_view_display.node.article.teaser.yml |  52 ++++++
 ...eld.field.comment.comment.comment_body.yml |  20 +++
 ...t_form.field_multiple_value_form_field.yml |  18 ++
 .../install/field.field.node.article.body.yml |  22 +++
 .../field.field.node.article.comment.yml      |  32 ++++
 .../field.field.node.article.field_image.yml  |  37 ++++
 .../field.field.node.article.field_tags.yml   |  26 +++
 ...essage.field_multiple_value_form_field.yml |  20 +++
 .../install/field.storage.node.comment.yml    |  19 +++
 .../field.storage.node.field_image.yml        |  31 ++++
 .../install/field.storage.node.field_tags.yml |  19 +++
 .../config/install/node.type.article.yml      |  10 ++
 .../install/taxonomy.vocabulary.tags.yml      |   7 +
 .../olivero_test/olivero_test.info.yml        |   9 +
 .../modules/olivero_test/olivero_test.module  |  16 ++
 .../FunctionalTests/Theme/OliveroTest.php     |  75 +++++++--
 .../Tests/Olivero/oliveroCommentTest.js       |  41 +++++
 .../Tests/Olivero/oliveroDesktopMenuTest.js   |  71 ++++++++
 .../{ => Olivero}/oliveroMobileMenuTest.js    |   0
 ...eroPreprocessFieldMultipleValueFormTest.js |  41 +++++
 .../Olivero/oliveroPreprocessInputTest.js     | 112 ++++++++++++
 .../Tests/Olivero/oliveroSearchFormTest.js    |  82 +++++++++
 .../oliveroStickyHeaderToggleTest.js          |   4 -
 .../Tests/oliveroDesktopMenuTest.js           | 159 ------------------
 .../TestSiteOliveroInstallTestScript.php      |  38 ++++-
 core/themes/olivero/olivero.theme             |   6 +-
 34 files changed, 1108 insertions(+), 181 deletions(-)
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/comment.type.comment.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/contact.form.olivero_test_contact_form.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.comment.comment.default.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.contact_message.olivero_test_contact_form.default.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.node.article.default.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.comment.comment.default.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.default.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.rss.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.teaser.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.field.comment.comment.comment_body.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.field.contact_message.olivero_test_contact_form.field_multiple_value_form_field.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.body.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.comment.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_image.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_tags.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.storage.contact_message.field_multiple_value_form_field.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.comment.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_image.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_tags.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/node.type.article.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/config/install/taxonomy.vocabulary.tags.yml
 create mode 100644 core/modules/system/tests/modules/olivero_test/olivero_test.module
 create mode 100644 core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroCommentTest.js
 create mode 100644 core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroDesktopMenuTest.js
 rename core/tests/Drupal/Nightwatch/Tests/{ => Olivero}/oliveroMobileMenuTest.js (100%)
 create mode 100644 core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessFieldMultipleValueFormTest.js
 create mode 100644 core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessInputTest.js
 create mode 100644 core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroSearchFormTest.js
 rename core/tests/Drupal/Nightwatch/Tests/{ => Olivero}/oliveroStickyHeaderToggleTest.js (90%)
 delete mode 100644 core/tests/Drupal/Nightwatch/Tests/oliveroDesktopMenuTest.js

diff --git a/core/modules/system/tests/modules/olivero_test/config/install/comment.type.comment.yml b/core/modules/system/tests/modules/olivero_test/config/install/comment.type.comment.yml
new file mode 100644
index 000000000000..ddcbbc986095
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/comment.type.comment.yml
@@ -0,0 +1,7 @@
+langcode: en
+status: true
+dependencies: {  }
+id: comment
+label: 'Default comments'
+target_entity_type_id: node
+description: 'Allows commenting on content'
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/contact.form.olivero_test_contact_form.yml b/core/modules/system/tests/modules/olivero_test/config/install/contact.form.olivero_test_contact_form.yml
new file mode 100644
index 000000000000..5b12a0d6a9f2
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/contact.form.olivero_test_contact_form.yml
@@ -0,0 +1,11 @@
+langcode: en
+status: true
+dependencies: {  }
+id: olivero_test_contact_form
+label: 'Olivero Test Contact Form'
+recipients:
+  - webmaster@example.com
+reply: ''
+weight: 0
+message: ''
+redirect: ''
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.comment.comment.default.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.comment.comment.default.yml
new file mode 100644
index 000000000000..1010be292488
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.comment.comment.default.yml
@@ -0,0 +1,33 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+    - field.field.comment.comment.comment_body
+  module:
+    - text
+id: comment.comment.default
+targetEntityType: comment
+bundle: comment
+mode: default
+content:
+  author:
+    weight: -2
+    region: content
+  comment_body:
+    type: text_textarea
+    weight: 11
+    region: content
+    settings:
+      rows: 5
+      placeholder: ''
+    third_party_settings: {  }
+  subject:
+    type: string_textfield
+    weight: 10
+    region: content
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+hidden: {  }
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.contact_message.olivero_test_contact_form.default.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.contact_message.olivero_test_contact_form.default.yml
new file mode 100644
index 000000000000..94ea7ba27532
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.contact_message.olivero_test_contact_form.default.yml
@@ -0,0 +1,56 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - contact.form.olivero_test_contact_form
+    - field.field.contact_message.olivero_test_contact_form.field_multiple_value_form_field
+id: contact_message.olivero_test_contact_form.default
+targetEntityType: contact_message
+bundle: olivero_test_contact_form
+mode: default
+content:
+  copy:
+    weight: 50
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+  field_multiple_value_form_field:
+    weight: 51
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+    type: string_textfield
+    region: content
+  mail:
+    weight: -40
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+  message:
+    type: string_textarea
+    weight: 0
+    settings:
+      rows: 12
+      placeholder: ''
+    region: content
+    third_party_settings: {  }
+  name:
+    weight: -50
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+  preview:
+    weight: 40
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+  subject:
+    type: string_textfield
+    weight: -10
+    region: content
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+hidden: {  }
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.node.article.default.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.node.article.default.yml
new file mode 100644
index 000000000000..1f7102dd49ed
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_form_display.node.article.default.yml
@@ -0,0 +1,106 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - image.style.thumbnail
+    - node.type.article
+  module:
+    - comment
+    - image
+    - path
+    - text
+id: node.article.default
+targetEntityType: node
+bundle: article
+mode: default
+content:
+  body:
+    type: text_textarea_with_summary
+    weight: 1
+    region: content
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+      show_summary: false
+    third_party_settings: {  }
+  comment:
+    type: comment_default
+    weight: 20
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  created:
+    type: datetime_timestamp
+    weight: 10
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  field_image:
+    type: image_image
+    weight: 4
+    region: content
+    settings:
+      progress_indicator: throbber
+      preview_image_style: thumbnail
+    third_party_settings: {  }
+  field_tags:
+    type: entity_reference_autocomplete_tags
+    weight: 3
+    region: content
+    settings:
+      match_operator: CONTAINS
+      match_limit: 10
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  path:
+    type: path
+    weight: 30
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  promote:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 15
+    region: content
+    third_party_settings: {  }
+  status:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 120
+    region: content
+    third_party_settings: {  }
+  sticky:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 16
+    region: content
+    third_party_settings: {  }
+  title:
+    type: string_textfield
+    weight: 0
+    region: content
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  uid:
+    type: entity_reference_autocomplete
+    weight: 5
+    region: content
+    settings:
+      match_operator: CONTAINS
+      match_limit: 10
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+hidden: {  }
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.comment.comment.default.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.comment.comment.default.yml
new file mode 100644
index 000000000000..6ae213d3ee0d
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.comment.comment.default.yml
@@ -0,0 +1,24 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+    - field.field.comment.comment.comment_body
+  module:
+    - text
+id: comment.comment.default
+targetEntityType: comment
+bundle: comment
+mode: default
+content:
+  comment_body:
+    label: hidden
+    type: text_default
+    weight: 0
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  links:
+    weight: 100
+    region: content
+hidden: {  }
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.default.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.default.yml
new file mode 100644
index 000000000000..5019b6503d79
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.default.yml
@@ -0,0 +1,60 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_display.comment.comment.default
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - image.style.large
+    - node.type.article
+  module:
+    - comment
+    - image
+    - text
+    - user
+id: node.article.default
+targetEntityType: node
+bundle: article
+mode: default
+content:
+  body:
+    type: text_default
+    weight: 0
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+    label: hidden
+  comment:
+    type: comment_default
+    weight: 110
+    region: content
+    label: above
+    settings:
+      view_mode: default
+      pager_id: 0
+    third_party_settings: {  }
+  field_image:
+    type: image
+    weight: -1
+    region: content
+    settings:
+      image_style: large
+      image_link: ''
+    third_party_settings: {  }
+    label: hidden
+  field_tags:
+    type: entity_reference_label
+    weight: 10
+    region: content
+    label: above
+    settings:
+      link: true
+    third_party_settings: {  }
+  links:
+    weight: 100
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+hidden: {  }
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.rss.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.rss.yml
new file mode 100644
index 000000000000..84660b6d2bd2
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.rss.yml
@@ -0,0 +1,25 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.rss
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - node.type.article
+  module:
+    - user
+id: node.article.rss
+targetEntityType: node
+bundle: article
+mode: rss
+content:
+  links:
+    weight: 100
+    region: content
+hidden:
+  body: true
+  comment: true
+  field_image: true
+  field_tags: true
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.teaser.yml b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.teaser.yml
new file mode 100644
index 000000000000..7b96908bed1c
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/core.entity_view_display.node.article.teaser.yml
@@ -0,0 +1,52 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - field.field.node.article.body
+    - field.field.node.article.comment
+    - field.field.node.article.field_image
+    - field.field.node.article.field_tags
+    - image.style.medium
+    - node.type.article
+  module:
+    - image
+    - text
+    - user
+id: node.article.teaser
+targetEntityType: node
+bundle: article
+mode: teaser
+content:
+  body:
+    type: text_summary_or_trimmed
+    weight: 0
+    region: content
+    settings:
+      trim_length: 600
+    third_party_settings: {  }
+    label: hidden
+  field_image:
+    type: image
+    weight: -1
+    region: content
+    settings:
+      image_style: medium
+      image_link: content
+    third_party_settings: {  }
+    label: hidden
+  field_tags:
+    type: entity_reference_label
+    weight: 10
+    region: content
+    settings:
+      link: true
+    third_party_settings: {  }
+    label: above
+  links:
+    weight: 100
+    region: content
+hidden:
+  comment: true
+  field_image: true
+  field_tags: true
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.field.comment.comment.comment_body.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.field.comment.comment.comment_body.yml
new file mode 100644
index 000000000000..1337070d16b8
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.field.comment.comment.comment_body.yml
@@ -0,0 +1,20 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - comment.type.comment
+    - field.storage.comment.comment_body
+  module:
+    - text
+id: comment.comment.comment_body
+field_name: comment_body
+entity_type: comment
+bundle: comment
+label: Comment
+description: ''
+required: true
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings: {  }
+field_type: text_long
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.field.contact_message.olivero_test_contact_form.field_multiple_value_form_field.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.field.contact_message.olivero_test_contact_form.field_multiple_value_form_field.yml
new file mode 100644
index 000000000000..48586444177f
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.field.contact_message.olivero_test_contact_form.field_multiple_value_form_field.yml
@@ -0,0 +1,18 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - contact.form.olivero_test_contact_form
+    - field.storage.contact_message.field_multiple_value_form_field
+id: contact_message.olivero_test_contact_form.field_multiple_value_form_field
+field_name: field_multiple_value_form_field
+entity_type: contact_message
+bundle: olivero_test_contact_form
+label: 'Multiple Value Form Field'
+description: ''
+required: true
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings: {  }
+field_type: string
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.body.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.body.yml
new file mode 100644
index 000000000000..b36fbd584493
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.body.yml
@@ -0,0 +1,22 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+    - node.type.article
+  module:
+    - text
+id: node.article.body
+field_name: body
+entity_type: node
+bundle: article
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: true
+  required_summary: false
+field_type: text_with_summary
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.comment.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.comment.yml
new file mode 100644
index 000000000000..922015ed9666
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.comment.yml
@@ -0,0 +1,32 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.comment
+    - node.type.article
+  module:
+    - comment
+id: node.article.comment
+field_name: comment
+entity_type: node
+bundle: article
+label: Comments
+description: ''
+required: false
+translatable: true
+default_value:
+  -
+    status: 2
+    cid: 0
+    last_comment_name: null
+    last_comment_timestamp: 0
+    last_comment_uid: 0
+    comment_count: 0
+default_value_callback: ''
+settings:
+  default_mode: 1
+  per_page: 50
+  form_location: true
+  anonymous: 0
+  preview: 1
+field_type: comment
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_image.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_image.yml
new file mode 100644
index 000000000000..b4b1c1466b7d
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_image.yml
@@ -0,0 +1,37 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.field_image
+    - node.type.article
+  module:
+    - image
+id: node.article.field_image
+field_name: field_image
+entity_type: node
+bundle: article
+label: Image
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  file_directory: '[date:custom:Y]-[date:custom:m]'
+  file_extensions: 'png gif jpg jpeg'
+  max_filesize: ''
+  max_resolution: ''
+  min_resolution: ''
+  alt_field: true
+  title_field: false
+  alt_field_required: true
+  title_field_required: false
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+  handler: 'default:file'
+  handler_settings: {  }
+field_type: image
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_tags.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_tags.yml
new file mode 100644
index 000000000000..1b9c4cc4ee1e
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.field.node.article.field_tags.yml
@@ -0,0 +1,26 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.field_tags
+    - node.type.article
+    - taxonomy.vocabulary.tags
+id: node.article.field_tags
+field_name: field_tags
+entity_type: node
+bundle: article
+label: Tags
+description: 'Enter a comma-separated list. For example: Amsterdam, Mexico City, "Cleveland, Ohio"'
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:taxonomy_term'
+  handler_settings:
+    target_bundles:
+      tags: tags
+    sort:
+      field: _none
+    auto_create: true
+field_type: entity_reference
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.storage.contact_message.field_multiple_value_form_field.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.contact_message.field_multiple_value_form_field.yml
new file mode 100644
index 000000000000..faef29520340
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.contact_message.field_multiple_value_form_field.yml
@@ -0,0 +1,20 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - contact
+id: contact_message.field_multiple_value_form_field
+field_name: field_multiple_value_form_field
+entity_type: contact_message
+type: string
+settings:
+  max_length: 255
+  is_ascii: false
+  case_sensitive: false
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.comment.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.comment.yml
new file mode 100644
index 000000000000..c5eee2c2841d
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.comment.yml
@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - comment
+    - node
+id: node.comment
+field_name: comment
+entity_type: node
+type: comment
+settings:
+  comment_type: comment
+module: comment
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_image.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_image.yml
new file mode 100644
index 000000000000..e4da7085460c
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_image.yml
@@ -0,0 +1,31 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - file
+    - image
+    - node
+id: node.field_image
+field_name: field_image
+entity_type: node
+type: image
+settings:
+  uri_scheme: public
+  default_image:
+    uuid: null
+    alt: ''
+    title: ''
+    width: null
+    height: null
+  target_type: file
+  display_field: false
+  display_default: false
+module: image
+locked: false
+cardinality: 1
+translatable: true
+indexes:
+  target_id:
+    - target_id
+persist_with_no_fields: false
+custom_storage: false
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_tags.yml b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_tags.yml
new file mode 100644
index 000000000000..73f821f2c0de
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/field.storage.node.field_tags.yml
@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - node
+    - taxonomy
+id: node.field_tags
+field_name: field_tags
+entity_type: node
+type: entity_reference
+settings:
+  target_type: taxonomy_term
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/node.type.article.yml b/core/modules/system/tests/modules/olivero_test/config/install/node.type.article.yml
new file mode 100644
index 000000000000..1fd439ce71bf
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/node.type.article.yml
@@ -0,0 +1,10 @@
+langcode: en
+status: true
+dependencies: {  }
+name: Article
+type: article
+description: 'Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'
+help: ''
+new_revision: true
+preview_mode: 1
+display_submitted: true
diff --git a/core/modules/system/tests/modules/olivero_test/config/install/taxonomy.vocabulary.tags.yml b/core/modules/system/tests/modules/olivero_test/config/install/taxonomy.vocabulary.tags.yml
new file mode 100644
index 000000000000..4c754e86c715
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/config/install/taxonomy.vocabulary.tags.yml
@@ -0,0 +1,7 @@
+langcode: en
+status: true
+dependencies: {  }
+name: Tags
+vid: tags
+description: 'Use tags to group articles on similar topics into categories.'
+weight: 0
diff --git a/core/modules/system/tests/modules/olivero_test/olivero_test.info.yml b/core/modules/system/tests/modules/olivero_test/olivero_test.info.yml
index 53451469da3e..30e430d57c40 100644
--- a/core/modules/system/tests/modules/olivero_test/olivero_test.info.yml
+++ b/core/modules/system/tests/modules/olivero_test/olivero_test.info.yml
@@ -3,3 +3,12 @@ type: module
 description: 'Support module for testing the Olivero theme.'
 package: Testing
 version: VERSION
+dependencies:
+  - drupal:comment
+  - drupal:contact
+  - drupal:form_test
+  - drupal:image
+  - drupal:path
+  - drupal:search
+  - drupal:taxonomy
+  - drupal:views
diff --git a/core/modules/system/tests/modules/olivero_test/olivero_test.module b/core/modules/system/tests/modules/olivero_test/olivero_test.module
new file mode 100644
index 000000000000..6be87370e6eb
--- /dev/null
+++ b/core/modules/system/tests/modules/olivero_test/olivero_test.module
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Functions to support testing the Olivero theme.
+ */
+
+/**
+ * Implements hook_preprocess_field_multiple_value_form().
+ */
+function olivero_test_preprocess_field_multiple_value_form(&$variables) {
+  // Set test multiple value form field to disabled
+  if ($variables["element"]["#field_name"] === "field_multiple_value_form_field") {
+    $variables['element']['#disabled'] = TRUE;
+  }
+}
diff --git a/core/tests/Drupal/FunctionalTests/Theme/OliveroTest.php b/core/tests/Drupal/FunctionalTests/Theme/OliveroTest.php
index 1668bf253131..ddae798c6fff 100644
--- a/core/tests/Drupal/FunctionalTests/Theme/OliveroTest.php
+++ b/core/tests/Drupal/FunctionalTests/Theme/OliveroTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\FunctionalTests\Theme;
 
 use Drupal\Tests\BrowserTestBase;
+use Drupal\menu_link_content\Entity\MenuLinkContent;
 
 /**
  * Tests the Olivero theme.
@@ -14,30 +15,18 @@ class OliveroTest extends BrowserTestBase {
   /**
    * {@inheritdoc}
    */
-  protected static $modules = ['system', 'block'];
+  protected $profile = 'minimal';
 
   /**
    * {@inheritdoc}
-   *
-   * It should eventually be possible to set this to 'olivero' once the theme
-   * is in core.
    */
-  protected $defaultTheme = 'stark';
+  protected $defaultTheme = 'olivero';
 
   /**
    * {@inheritdoc}
    */
   protected function setUp(): void {
     parent::setUp();
-
-    // Install & set Olivero as default the theme.
-    // Note: it should be possible to remove this once Olivero can be set as
-    // the default theme above.
-    $this->container->get('theme_installer')->install(['olivero'], TRUE);
-    $system_theme_config = $this->container->get('config.factory')->getEditable('system.theme');
-    $system_theme_config
-      ->set('default', 'olivero')
-      ->save();
   }
 
   /**
@@ -75,11 +64,67 @@ public function testConfigSchema() {
     $this->assertSession()->elementExists('css', '#block-olivero-search-form-wide');
   }
 
+  /**
+   * Tests that olivero_preprocess_block is functioning as expected.
+   *
+   * @see olivero.libraries.yml
+   */
+  public function testPreprocessBlock() {
+    $this->drupalGet('');
+    $this->assertSession()->statusCodeEquals(200);
+
+    // Confirm that search narrow and search wide libraries haven't yet been
+    // added.
+    $this->assertSession()->responseNotContains('olivero/css/components/header-search-wide.css');
+    $this->assertSession()->responseNotContains('olivero/css/components/header-search-narrow.css');
+
+    // Enable modules that will exercise preprocess block logic.
+    \Drupal::service('module_installer')->install(
+      ['search', 'menu_link_content']
+    );
+
+    // Add at least one link to the main menu.
+    $parent_menu_link_content = MenuLinkContent::create([
+      'title' => 'Home',
+      'menu_name' => 'main',
+      'link' => ['uri' => 'route:<front>'],
+    ]);
+    $parent_menu_link_content->save();
+
+    // Set branding color.
+    $system_theme_config = $this->container->get('config.factory')->getEditable('olivero.settings');
+    $system_theme_config
+      ->set('site_branding_bg_color', 'gray')
+      ->save();
+
+    $this->rebuildAll();
+    $this->drupalLogin(
+      $this->drupalCreateUser(['search content'])
+    );
+
+    // Ensure region attribute was added for primary menu.
+    $this->assertSession()->elementExists('css', 'ul[region="primary_menu"]');
+
+    // Confirm that search narrow and search wide libraries were added by
+    // preprocess.
+    $this->assertSession()->responseContains('olivero/css/components/header-search-wide.css');
+    $this->assertSession()->responseContains('olivero/css/components/header-search-narrow.css');
+
+    // Confirm primary-nav class was added to main menu navigation block.
+    $this->assertSession()->elementExists('css', '#block-olivero-main-menu.primary-nav');
+
+    // Ensure branding background color class was added.
+    $this->assertSession()->elementExists('css', '#block-olivero-site-branding.site-branding--bg-gray');
+  }
+
   /**
    * Tests that the Olivero theme can be uninstalled.
    */
   public function testIsUninstallable() {
-    $this->drupalLogin($this->drupalCreateUser(['access administration pages', 'administer themes']));
+    $this->drupalLogin($this->drupalCreateUser([
+      'access administration pages',
+      'administer themes',
+    ]));
 
     $this->drupalGet('admin/appearance');
     $this->cssSelect('a[title="Install Bartik as default theme"]')[0]->click();
diff --git a/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroCommentTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroCommentTest.js
new file mode 100644
index 000000000000..6b7195ca4547
--- /dev/null
+++ b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroCommentTest.js
@@ -0,0 +1,41 @@
+const commentTitleSelector = 'h2.comments__title';
+const commentCountSelector = 'h2.comments__title .comments__count';
+
+module.exports = {
+  '@tags': ['core', 'olivero'],
+  before(browser) {
+    browser
+      .drupalInstall({
+        setupFile:
+          'core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php',
+        installProfile: 'minimal',
+      })
+      .drupalCreateUser({
+        name: 'user',
+        password: '123',
+        permissions: [
+          'access comments',
+          'post comments',
+          'skip comment approval',
+        ],
+      })
+      .drupalLogin({ name: 'user', password: '123' });
+  },
+  after(browser) {
+    browser.drupalUninstall();
+  },
+  'Article without comments should not display count': (browser) => {
+    browser
+      .drupalRelativeURL('/node/1')
+      .assert.containsText('body', 'Article without comments')
+      .assert.not.elementPresent(commentTitleSelector);
+  },
+  'Article with comments should display count': (browser) => {
+    browser
+      .drupalRelativeURL('/node/2')
+      .assert.containsText('body', 'Article with comments')
+      .assert.elementPresent(commentTitleSelector)
+      .assert.elementPresent(commentCountSelector)
+      .assert.containsText(commentCountSelector, '2');
+  },
+};
diff --git a/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroDesktopMenuTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroDesktopMenuTest.js
new file mode 100644
index 000000000000..faca431341d6
--- /dev/null
+++ b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroDesktopMenuTest.js
@@ -0,0 +1,71 @@
+const headerNavSelector = '#header-nav';
+const linkSubMenuId = 'home-submenu-1';
+const buttonSubMenuId = 'button-submenu-2';
+
+module.exports = {
+  '@tags': ['core', 'olivero'],
+  before(browser) {
+    browser.drupalInstall({
+      setupFile:
+        'core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php',
+      installProfile: 'minimal',
+    });
+    browser.resizeWindow(1600, 800);
+  },
+  after(browser) {
+    browser.drupalUninstall();
+  },
+  'Verify Olivero desktop menu click functionality': (browser) => {
+    browser
+      .drupalRelativeURL('/node')
+      .waitForElementVisible(headerNavSelector)
+      .assert.not.visible(`#${linkSubMenuId}`)
+      .assert.attributeEquals(
+        `[aria-controls="${linkSubMenuId}"]`,
+        'aria-expanded',
+        'false',
+      )
+      .click(`[aria-controls="${linkSubMenuId}"]`)
+      .assert.visible(`#${linkSubMenuId}`)
+      .assert.attributeEquals(
+        `[aria-controls="${linkSubMenuId}"]`,
+        'aria-expanded',
+        'true',
+      )
+
+      // Test interactions for route:<button> menu links.
+      .assert.not.visible(`#${buttonSubMenuId}`)
+      .assert.attributeEquals(
+        `[aria-controls="${buttonSubMenuId}"]`,
+        'aria-expanded',
+        'false',
+      )
+      .click(`[aria-controls="${buttonSubMenuId}"]`)
+      .assert.visible(`#${buttonSubMenuId}`)
+      .assert.attributeEquals(
+        `[aria-controls="${buttonSubMenuId}"]`,
+        'aria-expanded',
+        'true',
+      );
+  },
+  'Verify Olivero desktop menu hover functionality': (browser) => {
+    browser
+      .drupalRelativeURL('/node')
+      .waitForElementVisible(headerNavSelector)
+      .assert.visible(headerNavSelector)
+      .moveToElement('link text', 'home')
+      .assert.visible(`#${linkSubMenuId}`)
+      .assert.attributeEquals(
+        `[aria-controls="${linkSubMenuId}"]`,
+        'aria-expanded',
+        'true',
+      )
+      .moveToElement('link text', 'button')
+      .assert.visible(`#${buttonSubMenuId}`)
+      .assert.attributeEquals(
+        `[aria-controls="${buttonSubMenuId}"]`,
+        'aria-expanded',
+        'true',
+      );
+  },
+};
diff --git a/core/tests/Drupal/Nightwatch/Tests/oliveroMobileMenuTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroMobileMenuTest.js
similarity index 100%
rename from core/tests/Drupal/Nightwatch/Tests/oliveroMobileMenuTest.js
rename to core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroMobileMenuTest.js
diff --git a/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessFieldMultipleValueFormTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessFieldMultipleValueFormTest.js
new file mode 100644
index 000000000000..3bbdc7259073
--- /dev/null
+++ b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessFieldMultipleValueFormTest.js
@@ -0,0 +1,41 @@
+const tableSelector = '#edit-field-multiple-value-form-field-wrapper table';
+const tableHeaderSelector = '#edit-field-multiple-value-form-field-wrapper th';
+const headerSelector = '#edit-field-multiple-value-form-field-wrapper h4';
+
+module.exports = {
+  '@tags': ['core', 'olivero'],
+  before(browser) {
+    browser
+      .drupalInstall({
+        setupFile:
+          'core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php',
+        installProfile: 'minimal',
+      })
+      .drupalCreateUser({
+        name: 'user',
+        password: '123',
+        permissions: ['access site-wide contact form'],
+      })
+      .drupalLogin({ name: 'user', password: '123' });
+  },
+  after(browser) {
+    browser.drupalUninstall();
+  },
+  'correct classes added to table and header': (browser) => {
+    browser
+      .resizeWindow(1400, 800)
+      .drupalRelativeURL('/contact/olivero_test_contact_form')
+      .waitForElementVisible(tableSelector, 1000)
+      .assert.cssClassPresent(tableSelector, [
+        'tabledrag-disabled',
+        'js-tabledrag-disabled',
+      ])
+      .assert.cssClassPresent(tableHeaderSelector, 'is-disabled')
+      .assert.cssClassPresent(headerSelector, [
+        'form-item__label',
+        'form-item__label--multiple-value-form',
+        'js-form-required',
+        'form-required',
+      ]);
+  },
+};
diff --git a/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessInputTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessInputTest.js
new file mode 100644
index 000000000000..368b207d2d7c
--- /dev/null
+++ b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroPreprocessInputTest.js
@@ -0,0 +1,112 @@
+const checkboxSelector = '#edit-form-checkboxes-title-attribute';
+
+const inputTypes = [
+  {
+    selector: '#edit-form-textfield-test-title-and-required',
+    type: 'text',
+    api: 'textfield',
+  },
+  {
+    selector: '#edit-form-email-title-no-xss',
+    type: 'email',
+    api: 'email',
+  },
+  {
+    selector: '#edit-form-tel-title-no-xss',
+    type: 'tel',
+    api: 'tel',
+  },
+  {
+    selector: '#edit-form-number-title-no-xss',
+    type: 'number',
+    api: 'number',
+  },
+  {
+    selector: '#edit-form-search-title-no-xss',
+    type: 'search',
+    api: 'search',
+  },
+  {
+    selector: '#edit-form-password-title-no-xss',
+    type: 'password',
+    api: 'password',
+  },
+  {
+    selector: '#edit-form-date-title-no-xss',
+    type: 'date',
+    api: 'date',
+  },
+  {
+    selector: '#edit-form-datetime-title-no-xss-time',
+    type: 'time',
+    api: 'date',
+  },
+  {
+    selector: '#edit-form-file-title-no-xss',
+    type: 'file',
+    api: 'file',
+  },
+  {
+    selector: '#edit-form-color-title-no-xss',
+    type: 'color',
+    api: 'color',
+  },
+  {
+    selector: '#edit-form-url-title-no-xss',
+    type: 'url',
+    api: 'url',
+  },
+  // TODO - Cover datetime-local, month, week - no test form input examples are easily available
+];
+
+const booleanInputTypes = [
+  {
+    selector: '#edit-form-checkboxes-test-first-checkbox',
+    type: 'checkbox',
+  },
+  {
+    selector: '#edit-form-radios-title-attribute-first-radio',
+    type: 'radio',
+  },
+];
+
+module.exports = {
+  '@tags': ['core', 'olivero'],
+  before(browser) {
+    browser.drupalInstall({
+      setupFile:
+        'core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php',
+      installProfile: 'minimal',
+    });
+  },
+  after(browser) {
+    browser.drupalUninstall();
+  },
+  'Confirm that title attribute exists if set to display': (browser) => {
+    browser
+      .resizeWindow(1400, 800)
+      .drupalRelativeURL('/form_test/form-labels')
+      .waitForElementVisible(checkboxSelector, 1000)
+      .assert.attributeEquals(
+        checkboxSelector,
+        'title',
+        'Checkboxes test (Required)',
+      );
+  },
+  'Check form element classes by type': (browser) => {
+    browser.drupalRelativeURL('/form_test/form-labels');
+    inputTypes.forEach((inputType) => {
+      browser.assert.cssClassPresent(inputType.selector, [
+        'form-element',
+        `form-element--type-${inputType.type}`,
+        `form-element--api-${inputType.api}`,
+      ]);
+    });
+    booleanInputTypes.forEach((booleanInputType) => {
+      browser.assert.cssClassPresent(booleanInputType.selector, [
+        'form-boolean',
+        `form-boolean--type-${booleanInputType.type}`,
+      ]);
+    });
+  },
+};
diff --git a/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroSearchFormTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroSearchFormTest.js
new file mode 100644
index 000000000000..0632b20a0534
--- /dev/null
+++ b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroSearchFormTest.js
@@ -0,0 +1,82 @@
+const mobileNavButtonSelector = 'button.mobile-nav-button';
+const headerNavSelector = '#header-nav';
+const searchButtonSelector = 'button.block-search-wide__button';
+const searchFormSelector = '.search-form.search-block-form';
+const searchWideSelector = '.block-search-wide__wrapper';
+const searchNarrowSelector = '.block-search-narrow';
+
+module.exports = {
+  '@tags': ['core', 'olivero'],
+  before(browser) {
+    browser
+      .drupalInstall({
+        setupFile:
+          'core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php',
+        installProfile: 'minimal',
+      })
+      // Create user that can search.
+      .drupalCreateUser({
+        name: 'user',
+        password: '123',
+        permissions: ['search content', 'use advanced search'],
+      })
+      .drupalLogin({ name: 'user', password: '123' });
+  },
+  after(browser) {
+    browser.drupalUninstall();
+  },
+  'search wide form is accessible and altered': (browser) => {
+    browser
+      .resizeWindow(1400, 800)
+      .drupalRelativeURL('/')
+      .click(searchButtonSelector)
+      .waitForElementVisible(`${searchWideSelector}`)
+      .waitForElementVisible(`${searchWideSelector} ${searchFormSelector}`)
+      .assert.attributeContains(
+        `${searchWideSelector} ${searchFormSelector} input[name=keys]`,
+        'placeholder',
+        'Search by keyword or phrase.',
+      )
+      .assert.attributeContains(
+        `${searchWideSelector} ${searchFormSelector} input[name=keys]`,
+        'title',
+        'Enter the terms you wish to search for.',
+      )
+      .assert.elementPresent('button.search-form__submit');
+  },
+  'search narrow form is accessible': (browser) => {
+    browser
+      .resizeWindow(1000, 800)
+      .drupalRelativeURL('/')
+      .click(mobileNavButtonSelector)
+      .waitForElementVisible(headerNavSelector)
+      .waitForElementVisible(`${searchNarrowSelector} ${searchFormSelector}`);
+  },
+  'submit button styled as primary on forms with <= 2 actions': (browser) => {
+    browser
+      .resizeWindow(1400, 800)
+      .drupalRelativeURL('/form-test/object-controller-builder')
+      .assert.elementPresent(
+        '#edit-actions input[type=submit].button--primary',
+      );
+  },
+  'search page is altered': (browser) => {
+    browser
+      .resizeWindow(1400, 800)
+      .drupalRelativeURL('/search')
+      .assert.attributeContains(
+        '.search-form input[name=keys]',
+        'placeholder',
+        'Search by keyword or phrase.',
+      )
+      .assert.attributeContains(
+        '.search-form input[name=keys]',
+        'title',
+        'Enter the terms you wish to search for.',
+      )
+      .assert.elementPresent('#edit-basic input[type=submit].button--primary')
+      .assert.elementPresent(
+        '#edit-advanced input[type=submit].button--primary',
+      );
+  },
+};
diff --git a/core/tests/Drupal/Nightwatch/Tests/oliveroStickyHeaderToggleTest.js b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroStickyHeaderToggleTest.js
similarity index 90%
rename from core/tests/Drupal/Nightwatch/Tests/oliveroStickyHeaderToggleTest.js
rename to core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroStickyHeaderToggleTest.js
index 5d238e30a5a7..edb169b821d6 100644
--- a/core/tests/Drupal/Nightwatch/Tests/oliveroStickyHeaderToggleTest.js
+++ b/core/tests/Drupal/Nightwatch/Tests/Olivero/oliveroStickyHeaderToggleTest.js
@@ -17,10 +17,6 @@ module.exports = {
   'On scroll, menu collapses to burger 🍔 menu': (browser) => {
     browser
       .drupalRelativeURL('/node')
-      .assert.containsText(
-        '#block-olivero-content h2',
-        'Congratulations and welcome to the Drupal community!',
-      )
       .assert.not.visible(buttonSelector)
       .assert.attributeEquals(buttonSelector, 'aria-checked', 'false')
       .getLocationInView('footer.site-footer', () => {
diff --git a/core/tests/Drupal/Nightwatch/Tests/oliveroDesktopMenuTest.js b/core/tests/Drupal/Nightwatch/Tests/oliveroDesktopMenuTest.js
deleted file mode 100644
index f581ef57344b..000000000000
--- a/core/tests/Drupal/Nightwatch/Tests/oliveroDesktopMenuTest.js
+++ /dev/null
@@ -1,159 +0,0 @@
-const headerNavSelector = '#header-nav';
-const linkSubMenuId = 'home-submenu-1';
-const buttonSubMenuId = 'button-submenu-2';
-
-module.exports = {
-  '@tags': ['core', 'olivero'],
-  before(browser) {
-    browser.drupalInstall({
-      setupFile:
-        'core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php',
-      installProfile: 'minimal',
-    });
-    browser.resizeWindow(1600, 800);
-  },
-  after(browser) {
-    browser.drupalUninstall();
-  },
-  'Verify Olivero desktop menu click functionality': (browser) => {
-    browser
-      .drupalRelativeURL('/node')
-      .waitForElementVisible(headerNavSelector)
-      .assert.not.visible(`#${linkSubMenuId}`)
-      .assert.attributeEquals(
-        `[aria-controls="${linkSubMenuId}"]`,
-        'aria-expanded',
-        'false',
-      )
-      .click(`[aria-controls="${linkSubMenuId}"]`)
-      .assert.visible(`#${linkSubMenuId}`)
-      .assert.attributeEquals(
-        `[aria-controls="${linkSubMenuId}"]`,
-        'aria-expanded',
-        'true',
-      )
-
-      // Test interactions for route:<button> menu links.
-      .assert.not.visible(`#${buttonSubMenuId}`)
-      .assert.attributeEquals(
-        `[aria-controls="${buttonSubMenuId}"]`,
-        'aria-expanded',
-        'false',
-      )
-      .click(`[aria-controls="${buttonSubMenuId}"]`)
-      .assert.visible(`#${buttonSubMenuId}`)
-      .assert.attributeEquals(
-        `[aria-controls="${buttonSubMenuId}"]`,
-        'aria-expanded',
-        'true',
-      );
-  },
-  'Verify Olivero desktop menu hover functionality': (browser) => {
-    browser
-      .drupalRelativeURL('/node')
-      .waitForElementVisible(headerNavSelector)
-      .assert.visible(headerNavSelector)
-      .moveToElement('link text', 'home')
-      .assert.visible(`#${linkSubMenuId}`)
-      .assert.attributeEquals(
-        `[aria-controls="${linkSubMenuId}"]`,
-        'aria-expanded',
-        'true',
-      )
-      .moveToElement('link text', 'button')
-      .assert.visible(`#${buttonSubMenuId}`)
-      .assert.attributeEquals(
-        `[aria-controls="${buttonSubMenuId}"]`,
-        'aria-expanded',
-        'true',
-      );
-  },
-  'Verify secondary navigation close on blur': (browser) => {
-    browser
-      .drupalRelativeURL('/node')
-      .waitForElementVisible(headerNavSelector)
-      .click(`[aria-controls="${linkSubMenuId}"]`)
-      .assert.attributeEquals(
-        `[aria-controls="${linkSubMenuId}"]`,
-        'aria-expanded',
-        'true',
-      );
-    browser
-      .execute(
-        // eslint-disable-next-line func-names, prefer-arrow-callback, no-shadow
-        function () {
-          document.querySelector('.site-branding__name a').focus();
-        },
-        [],
-      )
-      .pause(400)
-      .assert.attributeEquals(
-        `[aria-controls="${linkSubMenuId}"]`,
-        'aria-expanded',
-        'false',
-      );
-  },
-  'Verify parent <button> focus on ESC in wide navigation': (browser) => {
-    browser
-      // Verify functionality on regular link's button.
-      .drupalRelativeURL('/node')
-      .waitForElementVisible(headerNavSelector)
-      .click(`[aria-controls="${linkSubMenuId}"]`)
-      .waitForElementVisible(`#${linkSubMenuId}`)
-      .keys(browser.Keys.TAB)
-      .pause(50)
-      .execute(
-        // eslint-disable-next-line func-names, prefer-arrow-callback, no-shadow
-        function (linkSubMenuId) {
-          return document.activeElement.matches(`#${linkSubMenuId} *`);
-        },
-        [linkSubMenuId],
-        (result) => {
-          browser.assert.ok(result.value);
-        },
-      )
-      .keys(browser.Keys.ESCAPE)
-      .pause(50)
-      .execute(
-        // eslint-disable-next-line func-names, prefer-arrow-callback, no-shadow
-        function (linkSubMenuId) {
-          return document.activeElement.matches(
-            `[aria-controls="${linkSubMenuId}"]`,
-          );
-        },
-        [linkSubMenuId],
-        (result) => {
-          browser.assert.ok(result.value);
-        },
-      )
-      // Verify functionality on route:<button> button.
-      .click(`[aria-controls="${buttonSubMenuId}"]`)
-      .waitForElementVisible(`#${buttonSubMenuId}`)
-      .keys(browser.Keys.TAB)
-      .pause(50)
-      .execute(
-        // eslint-disable-next-line func-names, prefer-arrow-callback, no-shadow
-        function (buttonSubMenuId) {
-          return document.activeElement.matches(`#${buttonSubMenuId} *`);
-        },
-        [buttonSubMenuId],
-        (result) => {
-          browser.assert.ok(result.value);
-        },
-      )
-      .keys(browser.Keys.ESCAPE)
-      .pause(50)
-      .execute(
-        // eslint-disable-next-line func-names, prefer-arrow-callback, no-shadow
-        function (buttonSubMenuId) {
-          return document.activeElement.matches(
-            `[aria-controls="${buttonSubMenuId}"]`,
-          );
-        },
-        [buttonSubMenuId],
-        (result) => {
-          browser.assert.ok(result.value);
-        },
-      );
-  },
-};
diff --git a/core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php b/core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php
index d1080d66f824..a02c8d3a0430 100644
--- a/core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php
+++ b/core/tests/Drupal/TestSite/TestSiteOliveroInstallTestScript.php
@@ -4,6 +4,8 @@
 
 use Drupal\Core\Extension\ModuleInstallerInterface;
 use Drupal\Core\Extension\ThemeInstallerInterface;
+use Drupal\node\Entity\Node;
+use Drupal\comment\Entity\Comment;
 
 /**
  * Setup file used by TestSiteInstallTestScript.
@@ -19,7 +21,7 @@ public function setup() {
     // Install required module for the Olivero front page.
     $module_installer = \Drupal::service('module_installer');
     assert($module_installer instanceof ModuleInstallerInterface);
-    $module_installer->install(['views', 'olivero_test']);
+    $module_installer->install(['olivero_test']);
 
     // Install Olivero and set it as the default theme.
     $theme_installer = \Drupal::service('theme_installer');
@@ -27,6 +29,40 @@ public function setup() {
     $theme_installer->install(['olivero'], TRUE);
     $system_theme_config = \Drupal::configFactory()->getEditable('system.theme');
     $system_theme_config->set('default', 'olivero')->save();
+
+    // Create an article that will have no comments
+    $article_no_comments = Node::create(['type' => 'article']);
+    $article_no_comments->set('title', 'Article without comments');
+    // Enable comments
+    $article_no_comments->set('comment', 2);
+    $article_no_comments->save();
+
+    // Create an article that will have comments
+    $article_with_comments = Node::create(['type' => 'article']);
+    $article_with_comments->set('title', 'Article with comments');
+    // Enable comments
+    $article_with_comments->set('comment', 2);
+    $article_with_comments->save();
+
+    $values = [
+      // These values are for the entity that you're creating the comment for, not the comment itself.
+      'entity_type' => 'node',
+      'entity_id'   => 2,
+      'field_name'  => 'comment',
+      'uid' => 1,
+      // These values are for the comment itself.
+      'comment_type' => 'comment',
+      'subject' => 'A comment',
+      'comment_body' => 'Body of comment',
+      // Whether the comment is 'approved' or not.
+      'status' => 1,
+    ];
+    // Create comment entities out of our field values
+    $comment1 = Comment::create($values);
+    $comment1->save();
+
+    $comment2 = Comment::create($values);
+    $comment2->save();
   }
 
 }
diff --git a/core/themes/olivero/olivero.theme b/core/themes/olivero/olivero.theme
index d0617dee55f4..500ac751ff7a 100644
--- a/core/themes/olivero/olivero.theme
+++ b/core/themes/olivero/olivero.theme
@@ -188,7 +188,7 @@ function olivero_theme_suggestions_form_alter(array &$suggestions, array $variab
  * Implements hook_form_alter() for adding classes and placeholder text to the search forms.
  */
 function olivero_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  if (isset($form['actions']) && (count($form['actions'])) <= 2) {
+  if (isset($form['actions']['submit']) && (count($form['actions'])) <= 2) {
     $form['actions']['submit']['#attributes']['class'][] = 'button--primary';
   }
 
@@ -304,6 +304,8 @@ function olivero_preprocess_input(&$variables) {
     $variables['attributes']['class'][] = Html::getClass('form-element--type-' . $type_html);
     $variables['attributes']['class'][] = Html::getClass('form-element--api-' . $type_api);
 
+    // This logic is functioning as expected, but there is nothing in the theme that renders the result.
+    // As a result it can't currently be covered by a functional test.
     if (!empty($variables['element']['#autocomplete_route_name'])) {
       $variables['autocomplete_message'] = t('Loading…');
     }
@@ -370,7 +372,7 @@ function olivero_preprocess_field_multiple_value_form(&$variables) {
   // Make disabled available for the template.
   $variables['disabled'] = !empty($variables['element']['#disabled']);
 
-  if ($variables['multiple']) {
+  if (!empty($variables['multiple'])) {
     // Add an additional CSS class for the field label table cell.
     // This repeats the logic of template_preprocess_field_multiple_value_form()
     // without using '#prefix' and '#suffix' for the wrapper element.
-- 
GitLab