Skip to content

Commit

Permalink
Merge pull request #1639 from tvdeyen/add-essence-page
Browse files Browse the repository at this point in the history
Add Alchemy::EssencePage
  • Loading branch information
tvdeyen authored Oct 16, 2019
2 parents 7f805fc + 47496cc commit 2d7924e
Show file tree
Hide file tree
Showing 10 changed files with 164 additions and 1 deletion.
23 changes: 23 additions & 0 deletions app/models/alchemy/essence_page.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

module Alchemy
class EssencePage < BaseRecord
acts_as_essence(
ingredient_column: :page,
preview_text_method: :name
)

belongs_to :page, class_name: 'Alchemy::Page', optional: true

def ingredient=(page)
case page
when /\d/
self.page = Alchemy::Page.new(id: page)
when Alchemy::Page
self.page = page
else
super
end
end
end
end
9 changes: 9 additions & 0 deletions app/views/alchemy/essences/_essence_page_editor.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<div class="content_editor essence_page" id="<%= content.dom_id %>" data-content-id="<%= content.id %>">
<%= content_label(content) %>
<%= select_tag(
content.form_field_name,
pages_for_select,
id: content.form_field_id,
class: 'alchemy_selectbox full_width'
) %>
</div>
4 changes: 4 additions & 0 deletions app/views/alchemy/essences/_essence_page_view.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<% page = content.ingredient %>
<% if page %>
<%= link_to page.name, alchemy.show_page_path(urlname: page.urlname) %>
<% end %>
8 changes: 8 additions & 0 deletions db/migrate/20191016073858_create_alchemy_essence_pages.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class CreateAlchemyEssencePages < ActiveRecord::Migration[5.0]
def change
create_table :alchemy_essence_pages do |t|
t.references :page, null: true, foreign_key: { to_table: :alchemy_pages }
t.timestamps
end
end
end
10 changes: 10 additions & 0 deletions lib/alchemy/test_support/factories/essence_page_factory.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# frozen_string_literal: true

require 'factory_bot'
require 'alchemy/test_support/factories/page_factory'

FactoryBot.define do
factory :alchemy_essence_page, class: 'Alchemy::EssencePage' do
page factory: :alchemy_page
end
end
10 changes: 9 additions & 1 deletion spec/dummy/db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2019_04_17_070726) do
ActiveRecord::Schema.define(version: 2019_10_16_073858) do

create_table "alchemy_attachments", force: :cascade do |t|
t.string "name"
Expand Down Expand Up @@ -110,6 +110,13 @@
t.integer "updater_id"
end

create_table "alchemy_essence_pages", force: :cascade do |t|
t.integer "page_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["page_id"], name: "index_alchemy_essence_pages_on_page_id"
end

create_table "alchemy_essence_pictures", force: :cascade do |t|
t.integer "picture_id"
t.string "caption"
Expand Down Expand Up @@ -323,4 +330,5 @@

add_foreign_key "alchemy_contents", "alchemy_elements", column: "element_id", on_update: :cascade, on_delete: :cascade
add_foreign_key "alchemy_elements", "alchemy_pages", column: "page_id", on_update: :cascade, on_delete: :cascade
add_foreign_key "alchemy_essence_pages", "alchemy_pages", column: "page_id"
end
52 changes: 52 additions & 0 deletions spec/models/alchemy/essence_page_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe Alchemy::EssencePage, type: :model do
let(:essence) { build(:alchemy_essence_page) }
let(:page) { essence.page }

it_behaves_like "an essence" do
let(:ingredient_value) { page }
end

describe 'ingredient=' do
subject(:ingredient) { essence.page }

context 'when value is a String matching a number' do
let(:value) { '101' }

before do
essence.ingredient = value
end

it 'sets page to an page instance with that id' do
is_expected.to be_a(Alchemy::Page)
expect(ingredient.id).to eq(101)
end
end

context 'when value is an Alchemy Page' do
let(:value) { page }

before do
essence.ingredient = value
end

it 'sets page to an page instance with that id' do
is_expected.to be_a(Alchemy::Page)
expect(ingredient).to eq(page)
end
end

context 'when value is something else' do
let(:value) { 'something' }

it do
expect {
essence.ingredient = value
}.to raise_error(ActiveRecord::AssociationTypeMismatch)
end
end
end
end
18 changes: 18 additions & 0 deletions spec/views/essences/essence_page_editor_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe 'alchemy/essences/_essence_page_editor' do
let(:content) { Alchemy::Content.new(essence: essence) }
let(:essence) { Alchemy::EssencePage.new }

before do
view.class.send(:include, Alchemy::Admin::EssencesHelper)
allow(view).to receive(:content_label).and_return(content.name)
end

it "renders a page select box" do
render 'alchemy/essences/essence_page_editor', content: content
expect(rendered).to have_css('select.alchemy_selectbox.full_width')
end
end
30 changes: 30 additions & 0 deletions spec/views/essences/essence_page_view_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

require 'rails_helper'

describe 'alchemy/essences/_essence_page_view' do
let(:page) { build(:alchemy_page, urlname: 'a-page') }
let(:essence) { Alchemy::EssencePage.new(page: page) }
let(:content) { Alchemy::Content.new(essence: essence) }

context 'without page' do
let(:essence) { Alchemy::EssencePage.new }

it "renders nothing" do
render content, content: content
expect(rendered).to eq('')
end
end

context 'with page' do
it "renders a link to the page" do
render content, content: content
expect(rendered).to have_selector("a[href='/#{page.urlname}']")
end

it "has the page name as link text" do
render content, content: content
expect(rendered).to have_selector("a:contains('#{page.name}')")
end
end
end

0 comments on commit 2d7924e

Please sign in to comment.