hanami/spec/integration/action/view_rendering/paired_view_inference_spec.rb

116 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require "hanami"
RSpec.describe "App action / View rendering / Paired view inference", :app_integration do
before do
module TestApp
class App < Hanami::App
end
end
Hanami.app.prepare
module TestApp
class Action < Hanami::Action
end
end
end
let(:action) { action_class.new }
describe "Ordinary action" do
before do
module TestApp
module Actions
module Articles
class Index < TestApp::Action
end
end
end
end
end
let(:action_class) { TestApp::Actions::Articles::Index }
context "Paired view exists" do
before do
TestApp::App.register "views.articles.index", view
end
let(:view) { double(:view) }
it "auto-injects a paired view from a matching container identifier" do
expect(action.view).to be view
end
context "Another view explicitly auto-injected" do
before do
module TestApp
module Actions
module Articles
class Index < TestApp::Action
include Deps[view: "views.articles.custom"]
end
end
end
end
TestApp::App.register "views.articles.custom", explicit_view
end
let(:action_class) { TestApp::Actions::Articles::Index }
let(:explicit_view) { double(:explicit_view) }
it "respects the explicitly auto-injected view" do
expect(action.view).to be explicit_view
end
end
end
context "No paired view exists" do
it "does not auto-inject any view" do
expect(action.view).to be_nil
end
end
end
describe "RESTful action" do
before do
module TestApp
module Actions
module Articles
class Create < TestApp::Action
end
end
end
end
end
let(:action_class) { TestApp::Actions::Articles::Create }
let(:direct_paired_view) { double(:direct_paired_view) }
let(:alternative_paired_view) { double(:alternative_paired_view) }
context "Direct paired view exists" do
before do
TestApp::App.register "views.articles.create", direct_paired_view
TestApp::App.register "views.articles.new", alternative_paired_view
end
it "auto-injects the directly paired view" do
expect(action.view).to be direct_paired_view
end
end
context "Alternative paired view exists" do
before do
TestApp::App.register "views.articles.new", alternative_paired_view
end
it "auto-injects the alternative paired view" do
expect(action.view).to be alternative_paired_view
end
end
end
end