Instantly share code, notes, and snippets.

Embed
What would you like to do?
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
raise e
end
gemfile(true) do
source "https://rubygems.org"
gem "rails"
gem "pg"
gem "factory_girl_rails"
end
require "active_record"
require "action_controller/railtie"
ActiveRecord::Base.establish_connection(adapter: "postgresql", database: "railstestdb")
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :books, force: true do |t|
t.string :name
t.timestamps
end
create_table :categories, force: true do |t|
t.string :name
t.timestamps
end
create_table :categorizations, force: true do |t|
t.references :book
t.references :category
t.boolean :primary, default: false, null: false
t.timestamps
end
end
class Book < ActiveRecord::Base
has_many :categorizations
has_many :categories, through: :categorizations
end
class Category < ActiveRecord::Base
has_many :categorizations
has_many :books, through: :categorizations
def self.primaries
Category.joins(:categorizations).merge(Categorization.primaries)
end
end
class Categorization < ActiveRecord::Base
belongs_to :book
belongs_to :category
def self.primaries
where(primary: true)
end
end
class TestApp < Rails::Application
secrets.secret_token = "secret_token"
secrets.secret_key_base = "secret_key_base"
config.logger = Logger.new($stdout)
Rails.logger = config.logger
routes.draw do
resources :primary_categories, only: :index
end
end
class PrimaryCategoriesController < ActionController::Base
include Rails.application.routes.url_helpers
def index
@primary_categories = Category.primaries
render inline: "# of primary categories: <%= @primary_categories.count %>"
end
end
FactoryGirl.define do
factory :book do
name "Thing Explainer: Complicated Stuff in Simple Words"
trait :with_primary_category do
after(:create) do |book, _|
book.categorizations << Categorization.create!(category: create(:science_category), book: book, primary: true)
end
end
trait :with_secondary_category do
after(:create) do |book, _|
book.categorizations << Categorization.create!(category: create(:fun_facts_category), book: book, primary: false)
end
end
end
factory :science_category, class: Category do
name "Science & Scientists"
end
factory :fun_facts_category, class: Category do
name "Trivia & Fun Facts"
end
end
require "minitest"
class CategoryTest < Minitest::Test
def test_primary_categories
FactoryGirl.create(:book, :with_primary_category, :with_secondary_category)
assert_equal Category.primaries, [Category.find_by_name('Science & Scientists')]
end
end
class PrimaryCategoriesTest < Minitest::Test
include Rack::Test::Methods
def test_index
get "/primary_categories"
assert last_response.ok?
assert_equal last_response.body, "# of primary categories: 1"
end
private
def app
Rails.application
end
end
exit_code = Minitest.run
exit exit_code unless exit_code
require "rails/command"
require "rails/commands/server/server_command"
options = {
app: TestApp,
Host: '0.0.0.0'
}
Rails::Server.new(options).start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment