Skip to content

Commit

Permalink
Add support for mocking a form builder objects
Browse files Browse the repository at this point in the history
  • Loading branch information
drakmail committed Apr 29, 2016
1 parent 3038ade commit bd290be
Show file tree
Hide file tree
Showing 21 changed files with 166 additions and 6 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ test/dummy/.sass-cache
Gemfile.lock
test/tmp
*.gem

*.swp
4 changes: 4 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
AllCops:
RunRailsCops: true
Exclude:
- spec/dummy/db/schema.rb
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ rails = case rails_version
end

gem "rails", rails
gem "test-unit", "~> 3.0"

# Declare any dependencies that are still in development here instead of in
# your gemspec. These might include edge Rails or gems from your path or
Expand Down
50 changes: 50 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,56 @@ E.g: `app/components/card/card.yml`
:link: "http://google.com"

```

If your component depends on a form builder object you can use the following statement:

```yml
:meta: 'There is a class with form builder object'
:stubs:
-
:form:
!ruby/object:MountainView::Helpers::FormBuilder
model: !ruby/object:Something
attributes:
name: 'something name'
```
Also you can stub any ruby class with the following method:
```yml
:meta: 'There is a class with an AR object'
:stubs:
-
:some_model: !ruby/object:Something
attributes:
name: 'blabla'
```
For any complex logic you can define a custom Compoenent Stub with `init_with(coder)` method which will receive a `#map` with attributes loaded from yaml file:

```yml
:meta: 'There is a class with a complex logic'
:stubs:
-
:some_model: !ruby/object:ComponentStub
params:
- 'blabla'
- 'nothing'
name: 'Some Name'
```

```ruby
class ComponentStub < SomeModel # SomeModel could be AR class
def init_with(coder)
param1 = coder.map["params"].first
somename = coder.map["name"]
# or `@properties = coder.map`
initialize(param1, somename) # call initializer of SomeModel
end
end
```

3) Vist `http://localhost:3000/mountain_view/styleguide`

#### Example Style Guide
Expand Down
1 change: 1 addition & 0 deletions lib/mountain_view.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
require "mountain_view/configuration"
require "mountain_view/presenter"
require "mountain_view/component"
require "mountain_view/helpers/form_builder"

module MountainView
def self.configuration
Expand Down
12 changes: 12 additions & 0 deletions lib/mountain_view/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,17 @@ def stubs_correct_format?
def stubs_are_a_hash_with_info?
styleguide_stubs.is_a?(Hash) && styleguide_stubs.key?(:stubs)
end

def create_form_builder(stub)
ActionView::Base.default_form_builder.new(stub.class.model_name.param_key,
stub,
ActionView::Base.new,
{})
rescue
ActionView::Base.default_form_builder.new(stub.class.model_name.param_key,
stub,
ActionView::Base.new,
{}, nil)
end
end
end
18 changes: 18 additions & 0 deletions lib/mountain_view/helpers/form_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module MountainView
module Helpers
class FormBuilder < ActionView::Base.default_form_builder
def init_with(coder)
model = coder.map["model"]
create_form_builder(model)
end

private

def create_form_builder(model)
initialize(model.class.model_name.param_key, model, ActionView::Base.new, {})
rescue
initialize(model.class.model_name.param_key, model, ActionView::Base.new, {}, nil)
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<%= form.button "button text" %>
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
:meta: 'There is a class with form builder object'
:stubs:
-
:id: 1
:some_model: !ruby/object:Something
attributes:
name: 'blabla'
:form:
!ruby/object:MountainView::Helpers::FormBuilder
model: !ruby/object:Something
attributes:
name: 'something name'
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class FormCustomButtonComponent < MountainView::Presenter
property :form
property :some_model
end
4 changes: 4 additions & 0 deletions test/dummy/app/components/header/header.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,7 @@
-
:id: 2
:title: "You won't believe what happened to this man at Aspen"
-
:id: 3
:title: "Testing form objects"
:form: {form_for: Object}
2 changes: 2 additions & 0 deletions test/dummy/app/models/something.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Something < ActiveRecord::Base
end
7 changes: 2 additions & 5 deletions test/dummy/config/application.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
require File.expand_path('../boot', __FILE__)

require "active_support"
require "action_controller"
require "action_view"
require "sprockets/railtie"
require "rails/all"

Bundler.require(*Rails.groups)
require "mountain_view"
Expand Down Expand Up @@ -36,7 +33,7 @@ class Application < Rails::Application
# Do not eager load code on boot. This avoids loading your whole application
# just for the purpose of running a single test. If you are using a tool that
# preloads Rails for running tests, you may have to set it to true.
config.eager_load = false
config.eager_load = true

# Configure static asset server for tests with Cache-Control for performance.
config.static_cache_control = 'public, max-age=3600'
Expand Down
2 changes: 1 addition & 1 deletion test/dummy/config/database.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ development:
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
database: ":memory:"

production:
<<: *default
Expand Down
9 changes: 9 additions & 0 deletions test/dummy/db/migrate/20160427131303_create_somethings.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class CreateSomethings < ActiveRecord::Migration
def change
create_table :somethings do |t|
t.string :name

t.timestamps null: false
end
end
end
22 changes: 22 additions & 0 deletions test/dummy/db/schema.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 20160427131303) do

create_table "somethings", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

end
10 changes: 10 additions & 0 deletions test/mountain_view/component_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ def test_styleguide_stubs
},
{ id: 2,
title: "You won't believe what happened to this man at Aspen"
},
{
id: 3,
title: "Testing form objects",
form: { "form_for" => "Object" }
}
]
}
Expand All @@ -47,6 +52,11 @@ def test_component_stubs
{
id: 2,
title: "You won't believe what happened to this man at Aspen"
},
{
id: 3,
title: "Testing form objects",
form: { "form_for" => "Object" }
}
]
assert_instance_of Array, component.component_stubs
Expand Down
9 changes: 9 additions & 0 deletions test/mountain_view/presenter_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,13 @@ class MountainView::PresenterTest < ActiveSupport::TestCase
presenter = InheritedPresenter.new("inherited", {})
assert_equal [], presenter.data
end

test "loading of custom objects" do
component = MountainView::Component.new("form_custom_button")
stub_data = component.component_stubs.first
presenter = FormCustomButtonComponent.new("form_custom_button", stub_data)
assert_equal MountainView::Helpers::FormBuilder, presenter.form.class
assert_equal Something, presenter.some_model.class
assert_equal "blabla", presenter.some_model.name
end
end
2 changes: 2 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@
# for generators
require "rails/generators/test_case"
require "generators/mountain_view/component_generator"

load "#{Rails.root}/db/schema.rb"

0 comments on commit bd290be

Please sign in to comment.