diff --git a/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.html.erb b/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.html.erb
index ec322c0c160..e767301a4bb 100644
--- a/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.html.erb
+++ b/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.html.erb
@@ -12,25 +12,13 @@
<%= date %>
- <% if version.field_diffs.present? %>
+ <% if details_of_changes.present? %>
<%= render "govuk_publishing_components/components/details", {
title: "Details of changes",
open: is_latest,
} do %>
- <% capture do %>
- <%= render ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::FieldChangesTableComponent.new(
- version:,
- schema:,
- ) %>
-
- <% embedded_object_diffs.each do |item| %>
- <%= render ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::EmbeddedObject::FieldChangesTableComponent.new(
- **item,
- content_block_edition: version.item,
- ) %>
- <% end %>
- <% end %>
+ <% details_of_changes %>
<% end %>
<% end %>
diff --git a/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.rb b/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.rb
index 14b3d6967d5..0dd0b0af749 100644
--- a/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.rb
+++ b/lib/engines/content_block_manager/app/components/content_block_manager/content_block/document/show/document_timeline/timeline_item_component.rb
@@ -51,4 +51,31 @@ def embedded_object_diffs
end
}.flatten
end
+
+ def details_of_changes
+ @details_of_changes ||= begin
+ return "" if version.field_diffs.blank?
+
+ [
+ main_object_field_changes,
+ embedded_object_field_changes,
+ ].join.html_safe
+ end
+ end
+
+ def main_object_field_changes
+ render ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::FieldChangesTableComponent.new(
+ version:,
+ schema:,
+ )
+ end
+
+ def embedded_object_field_changes
+ embedded_object_diffs.map do |item|
+ render ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::EmbeddedObject::FieldChangesTableComponent.new(
+ **item,
+ content_block_edition: version.item,
+ )
+ end
+ end
end
diff --git a/lib/engines/content_block_manager/test/components/content_block/document/show/document_timeline/timeline_item_component_test.rb b/lib/engines/content_block_manager/test/components/content_block/document/show/document_timeline/timeline_item_component_test.rb
index c2217dc354d..223541c076f 100644
--- a/lib/engines/content_block_manager/test/components/content_block/document/show/document_timeline/timeline_item_component_test.rb
+++ b/lib/engines/content_block_manager/test/components/content_block/document/show/document_timeline/timeline_item_component_test.rb
@@ -110,7 +110,7 @@ class ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::Timel
describe "when field diffs are present" do
let(:field_diffs) { { "foo" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "previous value", new_value: "new value") } }
let(:version) do
- build(
+ build_stubbed(
:content_block_version,
event: "created",
whodunnit: user.id,
@@ -121,12 +121,14 @@ class ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::Timel
)
end
- it "renders the table component" do
- table_component = ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::FieldChangesTableComponent.new(
- version: build(:content_block_version, field_diffs: []),
+ let!(:table_component) do
+ ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::FieldChangesTableComponent.new(
+ version:,
schema:,
)
+ end
+ before do
ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::FieldChangesTableComponent
.expects(:new)
.with(version:, schema:)
@@ -134,14 +136,17 @@ class ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::Timel
component
.expects(:render)
- .with("govuk_publishing_components/components/details", { title: "Details of changes", open: false })
- .with_block_given
- .yields
+ .with(table_component)
+ .once
+ .returns("TABLE COMPONENT")
+ end
+ it "renders the table component unopened" do
component
.expects(:render)
- .with(table_component)
- .once
+ .with("govuk_publishing_components/components/details", { title: "Details of changes", open: false })
+ .with_block_given
+ .yields
render_inline component
end
@@ -157,70 +162,72 @@ class ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::Timel
render_inline component
end
end
+ end
- describe "when a field diff is for an embedded object" do
- let(:subschema) { stub(:subschema, id: "embedded_schema") }
- let(:schema) { stub(:schema, subschemas: [subschema]) }
+ describe "when a field diff is for an embedded object" do
+ let(:subschema) { stub(:subschema, id: "embedded_schema") }
+ let(:schema) { stub(:schema, subschemas: [subschema]) }
- let(:field_diffs) do
- {
- "details" => {
- "embedded_schema" => {
- "something" => {
- "field1" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
- "field2" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
- },
+ let(:field_diffs) do
+ {
+ "details" => {
+ "embedded_schema" => {
+ "something" => {
+ "field1" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
+ "field2" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
},
},
- }
- end
+ },
+ }
+ end
- let(:version) do
- build(
- :content_block_version,
- event: "created",
- whodunnit: user.id,
- state: "published",
- created_at: 4.days.ago,
- item: content_block_edition,
- field_diffs:,
- )
- end
+ let(:version) do
+ build_stubbed(
+ :content_block_version,
+ event: "created",
+ whodunnit: user.id,
+ state: "published",
+ created_at: 4.days.ago,
+ item: content_block_edition,
+ field_diffs:,
+ )
+ end
- it "renders the embedded table component" do
- table_component = stub("table_component")
+ it "renders the embedded table component" do
+ table_component = stub("table_component")
- ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::EmbeddedObject::FieldChangesTableComponent
- .expects(:new)
- .with(
- object_id: "something",
- field_diff: {
- "field1" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
- "field2" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
- },
- subschema_id: "embedded_schema",
- content_block_edition:,
- )
- .returns(table_component)
+ ContentBlockManager::ContentBlock::Document::Show::DocumentTimeline::EmbeddedObject::FieldChangesTableComponent
+ .expects(:new)
+ .with(
+ object_id: "something",
+ field_diff: {
+ "field1" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
+ "field2" => ContentBlockManager::ContentBlock::DiffItem.new(previous_value: "before", new_value: "after"),
+ },
+ subschema_id: "embedded_schema",
+ content_block_edition:,
+ )
+ .returns(table_component)
- component
- .expects(:render)
- .with("govuk_publishing_components/components/details", { title: "Details of changes", open: false })
- .with_block_given
- .yields
+ component
+ .expects(:render)
+ .with("govuk_publishing_components/components/details", { title: "Details of changes", open: false })
+ .with_block_given
+ .yields
- component
- .expects(:render)
- .with(table_component)
- .once
+ component
+ .expects(:render)
+ .with(table_component)
+ .once
+ .returns("TABLE COMPONENT 1")
- component
- .expects(:render)
- .with(anything)
- .once
+ component
+ .expects(:render)
+ .with(anything)
+ .once
+ .returns("TABLE COMPONENT 2")
- render_inline component
- end
+ render_inline component
end
end
end
diff --git a/lib/engines/content_block_manager/test/factories/content_block_version.rb b/lib/engines/content_block_manager/test/factories/content_block_version.rb
index e680b3b9b64..971124ac854 100644
--- a/lib/engines/content_block_manager/test/factories/content_block_version.rb
+++ b/lib/engines/content_block_manager/test/factories/content_block_version.rb
@@ -2,15 +2,15 @@
factory :content_block_version, class: "ContentBlockManager::ContentBlock::Version" do
event { "created" }
item do
- create(
+ build(
:content_block_edition,
- document: create(
+ document: build(
:content_block_document,
block_type: "email_address",
),
)
end
- whodunnit { create(:user).id }
+ whodunnit { build(:user).id }
state {}
end
end