require 'spec_helper'
class CustomEntryRenderer < RichTextRenderer::BaseNodeRenderer
def render(node)
"
Custom Content
"
end
end
class OtherCustomEntryRenderer < RichTextRenderer::BaseNodeRenderer
def render(node)
"#{node['data'].body}
"
end
end
class InstanceMock
def initialize(mappings = {})
@mappings = mappings
end
def options
{
rich_text_mappings: @mappings
}
end
end
class AppMock
def initialize(instances = {})
@instances = instances
end
def extensions
{
contentful: @instances
}
end
end
class HelpersMock
include ContentfulMiddleman::Helpers
def initialize(instances = {})
@instances = instances
end
def app
AppMock.new(@instances)
end
end
class InstanceDouble
end
describe ContentfulMiddleman::Helpers do
let(:entry) do
{
_meta: {
id: 'foo'
},
value_field: {
'es' => 'foo',
'en-US' => 'bar'
},
array_field: [
{
'es' => 'foobar',
'en-US' => 'baz'
}
],
nested_array: {
'en-US' => [
{
id: 'foo',
_meta: {
id: 'foo'
},
name: {
'es' => 'foo',
'en-US' => 'bar'
}
}, {
id: 'foo',
_meta: {
id: 'foo'
},
name: {
'en-NZ' => 'bar',
'en-US' => 'foo'
},
}
]
},
nested_hash: {
'en-US' => {
id: 'foo',
_meta: {
id: 'foo'
},
name: {
'es' => 'foo',
'en-US' => 'bar'
}
}
}
}
end
subject { HelpersMock.new }
before(:each) do
ContentfulMiddleman.instance_variable_set(:@contentful_middleman_instances, [])
end
describe 'instance methods' do
describe '#contentful_instances' do
it 'default - is an empty array' do
expect(subject.contentful_instances).to eq([])
end
it 'returns multiple instances' do
ContentfulMiddleman.instances << InstanceDouble.new
ContentfulMiddleman.instances << InstanceDouble.new
expect(subject.contentful_instances.size).to eq(2)
end
end
describe 'localization helpers' do
describe '#localize_value' do
it 'returns value if not a hash independently of locale' do
expect(subject.localize_value('foo', 'es')).to eq('foo')
end
describe 'value is a hash' do
it 'returns fallback_locale value if locale not found' do
expect(subject.localize_value({'en-US' => 'foo'}, 'es')).to eq('foo')
expect(subject.localize_value({'de-DE' => 'bar'}, 'es', 'de-DE')).to eq('bar')
end
it 'returns localized value if locale found' do
expect(subject.localize_value({'es' => 'foobar'}, 'es')).to eq('foobar')
end
it 'returns original values if both locale and fallback_locale not found' do
expect(subject.localize_value({'foo' => 'baz'}, 'es', 'de-DE')).to eq({'foo'=>'baz'})
end
end
end
describe '#localize_array' do
it 'calls #localize_value for every element in the array' do
expect(subject).to receive(:localize_value).with({'es' => 'foo'}, 'es', 'en-US')
subject.localize_array([{'es' => 'foo'}], 'es')
end
end
describe '#localize' do
it 'calls #localize_value for a value field' do
expect(subject).to receive(:localize_value).with({'es' => 'foo', 'en-US' => 'bar'}, 'es', 'en-US').and_call_original
expect(subject.localize(entry, :value_field, 'es')).to eq('foo')
end
it 'calls #localize_array for an array field' do
expect(subject).to receive(:localize_array).with([{'es' => 'foobar', 'en-US' => 'baz'}], 'es', 'en-US').and_call_original
expect(subject.localize(entry, :array_field, 'es')).to eq(['foobar'])
end
end
it '#localize_entry' do
localized_entry = subject.localize_entry(entry, 'es')
expect(localized_entry).to eq({
'_meta' => { 'id' => 'foo' },
'value_field' => 'foo',
'array_field' => ['foobar'],
'nested_array' => [
{
'id' => 'foo',
'_meta' => {
'id' => 'foo'
},
'name' => 'foo'
}, {
'id' => 'foo',
'_meta' => {
'id' => 'foo'
},
'name' => 'foo'
}
],
'nested_hash' => {
'id' => 'foo',
'_meta' => {
'id' => 'foo'
},
'name' => 'foo'
}
})
expect(localized_entry[:_meta]).to eq({ 'id' => 'foo' })
expect(localized_entry[:nested_array][0][:id]).to eq('foo')
expect(localized_entry[:nested_hash][:id]).to eq('foo')
end
end
describe 'preview helpers' do
describe '#with_preview' do
it 'creates a preview client' do
vcr('helpers/preview') {
subject.with_preview(space: 'cfexampleapi', access_token: 'b4c0n73n7fu1') do |preview|
expect(preview).to be_a ::Contentful::Client
expect(preview).to be_a ::ContentfulMiddleman::Tools::PreviewProxy
preview_entries = preview.entries
expect(preview_entries.size).to eq 11
expect(preview_entries).to be_a ::Contentful::Array
end
}
end
end
end
describe 'rich text helpers' do
describe '#rich_text' do
it 'renders a rich text field to HTML' do
expected = [
'Some heading
',
'',
'{"target"=>{"sys"=>{"id"=>"49rofLvvxCOiIMIi6mk8ai", "type"=>"Link", "linkType"=>"Entry"}}}
',
'Some subheading
',
'Some bold
',
'Some italics
',
'Some underline
',
'',
'',
'{"target"=>{"sys"=>{"id"=>"5ZF9Q4K6iWSYIU2OUs0UaQ", "type"=>"Link", "linkType"=>"Entry"}}}
',
'',
'Some raw content
',
'',
'An unpublished embed:
',
'',
'{"target"=>{"sys"=>{"id"=>"q2hGXkd5tICym64AcgeKK", "type"=>"Link", "linkType"=>"Entry"}}}
',
'Some more content
'
].join("\n")
expect(subject.rich_text(json('structured_text'))).to eq expected
end
it 'supports multiple configurations' do
vcr('helpers/rich_text') {
# Instances are a 0-based progressive hash with keys in the shape "instance_#{index}"
instances = {
"instance_0" => InstanceMock.new('embedded-entry-block' => CustomEntryRenderer),
"instance_1" => InstanceMock.new('embedded-entry-block' => OtherCustomEntryRenderer)
}
subject = HelpersMock.new(instances)
expected_default = [
'Some heading
',
'',
'Custom Content
',
'Some subheading
',
'Some bold
',
'Some italics
',
'Some underline
',
'',
'',
'Custom Content
',
'',
'Some raw content
',
'',
'An unpublished embed:
',
'',
'Some more content
',
'Some code
',
'A hyperlink
',
'Ul list
A few items
Ordered list nested inside an Unordered list item
',
'Ol list
two
three
',
'
',
'',
'An inspirational quote
',
''
].join("\n")
expected_different_config = [
'Some heading
',
'',
'Embedded 1
',
'Some subheading
',
'Some bold
',
'Some italics
',
'Some underline
',
'',
'',
'Embedded 2
',
'',
'Some raw content
',
'',
'An unpublished embed:
',
'',
'Some more content
',
'Some code
',
'A hyperlink
',
'Ul list
A few items
Ordered list nested inside an Unordered list item
',
'Ol list
two
three
',
'
',
'',
'An inspirational quote
',
''
].join("\n")
client = Contentful::Client.new(
space: 'jd7yc4wnatx3',
access_token: '6256b8ef7d66805ca41f2728271daf27e8fa6055873b802a813941a0fe696248',
dynamic_entries: :auto,
gzip_encoded: false
)
entry = client.entry('4BupPSmi4M02m0U48AQCSM')
expect(subject.rich_text(entry.body)).to eq expected_default
expect(subject.rich_text(entry.body, 1)).to eq expected_different_config
}
end
end
end
end
end