Code Monkey home page Code Monkey logo

temping's Introduction

Temping

Code Climate Build Status Gem Version

Description

Temping allows you to create arbitrary ActiveRecord models backed by a temporary SQL table for use in tests. You may need to do something like this if you're testing a module that is meant to be mixed into ActiveRecord models without relying on a concrete class.

Temping will use your existing database connection. As we're using temporary tables all data will be dropped when the database connection is terminated.

Examples

The basic setup of a model involves calling create with a symbol that represents the class name of the model you wish to create. By default, this will create a temporary table with an id column.

Temping.create :dog

Dog.create => #<Dog id: 1>
Dog.table_name => "dogs"
Dog => Dog(id: integer)

Keep in mind, the table name will always be pluralized, while the class name will be singular.

Temping.create :dogs

Dog.table_name => "dogs"
Dogs => NameError: uninitialized constant Dogs

Additional database columns can be specified via the with_columns method which uses Rails migration syntax:

Temping.create :dog do
  with_columns do |t|
    t.string :name
    t.integer :age, :weight
  end
end

Dog.create

# => #<Dog id: 1, name: nil, age: nil, weight: nil>

When a block is passed to create, it is evaluated in the context of the class. This means anything you do in an ActiveRecord model class body can be accomplished in the block including method definitions, validations, module includes, etc.

Temping.create :dog do
  validates :name, presence: true

  with_columns do |t|
    t.string :name
    t.integer :age, :weight
  end

  def quack
    "arf!"
  end
end

Dog.create!

# => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

codey = Dog.create! name: "Codey"
codey.quack

# => "arf!"

All attributes you can pass to create_table can be evaluated too. For example you can create a dog with a primary key of the type uuid:

Temping.create :dog, id: :uuid, default: -> { 'uuid_generate_v4()' }

Dog.create

# => #<Dog id: d937951b-765c-4bc9-804e-3171d22117b0>

Options

An option to specify the parent class can be given as a second parameter to Temping.create. This allows testing in environments where models inherit from a common base class.

# A custom base model class
class Vehicle < ActiveRecord::Base
  self.abstract_class = true
  def navigate_to(destination)
    # non-vehicle specific logic
  end
end

Temping.create :car, parent_class: Vehicle do
  with_columns do |t|
    t.string :name
    t.integer :num_wheels
  end
end
Temping.create :bus, parent_class: Vehicle do
  with_columns do |t|
    t.string :name
    t.integer :num_wheels
  end
end

my_car = Car.create
my_car.navigate_to(:home)

Installation

In your Gemfile:

gem "temping"

In test_helper.rb add the following block to ActiveSupport::TestCase:

class ActiveSupport::TestCase
  # ...
  teardown do
    Temping.teardown
  end
  # ...
end

Or, if you're using rspec, in spec_helper.rb add the following block to RSpec.configure:

RSpec.configure do |config|
  # ...
  config.after do
    Temping.teardown
  end
  # ...
end

Alternatively you may want to just cleanup tables, but keep defined models:

Temping.cleanup

Bugs, Features, Feedback

All contributions are welcome! Please take a look at CONTRIBUTING.md for some tips.

temping's People

Contributors

kitop avatar jpignata avatar gmoseson avatar oneamtu avatar bolshakov avatar bryanwoods avatar gregnavis avatar faucct avatar algorist avatar davidcelis avatar jaimeiniesta avatar supremebeing7 avatar planetmcd avatar nathanstitt avatar wbotelhos avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.