# encoding: utf-8 #:nodoc: REGEXP_ROWS = //m #:nodoc: REGEXP_HEADERS = //m #:nodoc: REGEXP_SORT_HEADERS = /.*?<\/a><\/th>/m #:nodoc: REGEXP_ACTION_CELL = /<\/td>/m #:nodoc: # A simple test helper to prepare the test database with a CrudTestModel model. # This helper is used to test the CrudController and various helpers # without the need for an application based model. module CrudTestHelper # Controller helper methods for the tests def model_class CrudTestModel end def controller_name 'crud_test_models' end def action_name 'index' end def params {} end def path_args(entry) entry end def sortable?(_attr) true end def h(text) ERB::Util.h(text) end private # Sets up the test database with a crud_test_models table. # Look at the source to view the column definition. def setup_db without_transaction do silence_stream(STDOUT) do c = ActiveRecord::Base.connection create_crud_test_models(c) create_other_crud_test_models(c) create_crud_test_models_other_crud_test_models(c) end CrudTestModel.reset_column_information end end def create_crud_test_models(c) c.create_table :crud_test_models, force: true do |t| t.string :name, null: false, limit: 50 t.string :email t.string :password t.string :whatever t.integer :children t.integer :companion_id t.float :rating t.decimal :income, precision: 14, scale: 4 t.date :birthdate t.time :gets_up_at t.datetime :last_seen t.boolean :human, default: true t.text :remarks t.timestamps null: false end end def create_other_crud_test_models(c) c.create_table :other_crud_test_models, force: true do |t| t.string :name, null: false, limit: 50 t.integer :more_id end end def create_crud_test_models_other_crud_test_models(c) c.create_table :crud_test_models_other_crud_test_models, force: true do |t| t.belongs_to :crud_test_model t.belongs_to :other_crud_test_model end end # Removes the crud_test_models table from the database. def reset_db c = ActiveRecord::Base.connection [:crud_test_models, :other_crud_test_models, :crud_test_models_other_crud_test_models].each do |table| c.drop_table(table) if c.table_exists?(table) end end # Creates 6 dummy entries for the crud_test_models table. def create_test_data (1..6).reduce(nil) { |a, e| create(e, a) } (1..6).each { |i| create_other(i) } end # Fixture-style accessor method to get CrudTestModel instances by name def crud_test_models(name) CrudTestModel.find_by_name(name.to_s) end def with_test_routing with_routing do |set| set.draw { resources :crud_test_models } # used to define a controller in these tests set.default_url_options = { controller: 'crud_test_models' } yield end end def special_routing # test:unit uses instance variable, rspec the method controller = @controller || @_controller || controller @routes = ActionDispatch::Routing::RouteSet.new routes = @routes controller.singleton_class.send(:include, routes.url_helpers) controller.view_context_class = Class.new(controller.view_context_class) do include routes.url_helpers end @routes.draw { resources :crud_test_models } end def create(index, companion) c = str(index) m = CrudTestModel.new( name: c, children: 10 - index, rating: "#{index}.#{index}".to_f, income: 10_000_000 * index + 0.1111 * index, birthdate: "#{1900 + 10 * index}-#{index}-#{index}", # store entire date to avoid time zone issues gets_up_at: Time.zone.local(2000, 1, 1, index, index), last_seen: "#{2000 + 10 * index}-#{index}-#{index} " \ "1#{index}:2#{index}", human: index.even?, remarks: "#{c} #{str(index + 1)} #{str(index + 2)}\n" * (index % 3 + 1)) m.companion = companion m.save! m end def create_other(index) c = str(index) others = CrudTestModel.all[index..(index + 2)] OtherCrudTestModel.create!(name: c, other_ids: others.map(&:id), more_id: others.first.try(:id)) end def str(index) (index + 64).chr * 5 end # A hack to avoid ddl in transaction issues with mysql. def without_transaction c = ActiveRecord::Base.connection start_transaction = false if c.adapter_name.downcase.include?('mysql') && c.open_transactions > 0 # in transactional tests, we may simply rollback c.execute('ROLLBACK') start_transaction = true end yield c.execute('BEGIN') if start_transaction end end