spec/seory/dsl_spec.rb in seory-0.0.3 vs spec/seory/dsl_spec.rb in seory-0.0.4

- old
+ new

@@ -1,40 +1,91 @@ require 'spec_helper' require 'seory/dsl' describe Seory::Dsl do - let(:seory_class) { Object.new.extend(Seory::Dsl) } - before do - seory_class.describe do - match 'products#index' do - title 'My Great Product' - h1 'Great Product Name' + subject(:seory) { seory_class.lookup(controller) } - misc :option, 'static optional val' - end + context 'with traditional syntax' do + let(:seory_class) { Object.new.extend(Seory::Dsl) } + before do + seory_class.describe do + match ->(c) { c.controller_name == 'reports' } do + title 'Useful reports' + end - default do - title 'Misc site' - h1 { controller.controller_name.upcase } + match 'products#index' do + title 'My Great Product' + h1 'Great Product Name' - misc(:option) { "dynamic option name at #{controller.controller_name}" } + misc :option, 'static optional val' + end + + default do + title 'Misc site' + h1 { controller.controller_name.upcase } + h2 'default h2' + + misc(:option) { "dynamic option name at #{controller.controller_name}" } + end end end - end - subject(:seory) { seory_class.lookup(controller) } + context 'at reports#index / match with proc' do + let(:controller) { double('controller', controller_name: 'reports', action_name: 'index') } - context 'at products#index' do - let(:controller) { double('controller', controller_name: 'products', action_name: 'index') } + specify { expect(seory.title).to eq 'Useful reports' } + end - specify { expect(seory.title).to eq 'My Great Product' } - specify { expect(seory.h1).to eq 'Great Product Name' } - specify { expect(seory.misc(:option)).to eq 'static optional val' } + context 'at products#index' do + let(:controller) { double('controller', controller_name: 'products', action_name: 'index') } + + specify { expect(seory.title).to eq 'My Great Product' } + specify { expect(seory.h1).to eq 'Great Product Name' } + specify { expect(seory.misc(:option)).to eq 'static optional val' } + + specify { expect(seory.h2).to eq 'default h2' } + end + + context 'at misc#show' do + let(:controller) { double('controller', controller_name: 'misc', action_name: 'show') } + + specify { expect(seory.h1).to eq 'MISC' } + specify { expect(seory.misc(:option)).to eq 'dynamic option name at misc' } + end end - context 'at misc#show' do - let(:controller) { double('controller', controller_name: 'misc', action_name: 'show') } + context 'with matcher build dsl syntax' do + let(:seory_class) { Object.new.extend(Seory::Dsl) } + before do + seory_class.describe do + match path('/products/special-product') do + title 'Special Product Detail' + end - specify { expect(seory.h1).to eq 'MISC' } - specify { expect(seory.misc(:option)).to eq 'dynamic option name at misc' } + match slug('products#show') do + title 'Great Product Detail' + end + end + end + + context 'at products#show' do + let(:controller) do + double('controller', controller_name: 'products', action_name: 'show', params: {id: 42}).tap do |c| + allow(c).to receive_message_chain(:request, :fullpath) { '/products/42' } + end + end + + specify { expect(seory.title).to eq 'Great Product Detail' } + end + + context 'at special product with path /products/special-product (although products#show)' do + let(:controller) do + double('controller', controller_name: 'products', action_name: 'show').tap do |c| + allow(c).to receive_message_chain(:request, :fullpath) { '/products/special-product' } + end + end + + specify { expect(seory.title).to eq 'Special Product Detail' } + end end + end