Skip to content

Instantly share code, notes, and snippets.

@zolotyx
Last active June 19, 2025 00:41
Show Gist options
  • Select an option

  • Save zolotyx/5f0aec85e69fa77160d5b7d8ac4f622e to your computer and use it in GitHub Desktop.

Select an option

Save zolotyx/5f0aec85e69fa77160d5b7d8ac4f622e to your computer and use it in GitHub Desktop.
# frozen_string_literal: true
# Question:
# a = 1
# b = 2
# a ||= b
#
# What is the result?
begin
require 'bundler/inline'
rescue LoadError => e
warn 'Bundler version 1.10 or later is required. Please update your Bundler'
raise e
end
gemfile(true) do
source 'https://rubygems.org'
gem 'activerecord', '~> 7.0'
gem 'activesupport', '~> 7.0'
gem 'sqlite3', '1.4'
gem 'minitest-reporters'
gem 'minitest-fail-fast'
end
###### Config START
require 'active_record'
require 'minitest/autorun'
require 'minitest/reporters'
require 'minitest/fail_fast'
Minitest::FailFastReporter.fail_fast!
ActiveSupport::TestCase.test_order = :sorted
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
###### Config END
##### Migration START
ActiveRecord::Schema.define do
create_table :users, force: true do |t|
t.integer :state, default: 0
t.string :name
t.text :bio
t.integer :comments_count, null: false, default: 0
end
create_table :comments, force: true do |t|
t.integer :user_id
t.string :body
end
create_table :user_details, force: true do |t|
t.integer :user_id
t.string :bsb
end
create_table :images, force: true do |t|
t.references :imageable, polymorphic: true, index: true
t.string :url
end
end
##### Migration END
##### ActiveRecord Models START
class Comment < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
include Singleton
has_many :images
has_many :comments, counter_cache: true
has_one :user_detail
delegate :bsb, to: :user_detail
def user_detail
super || create_user_detail
end
end
class UserDetail < ActiveRecord::Base
end
class Image < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
end
##### ActiveRecord Models END
############ TEST SUITE ############
class SimpleTest < Minitest::Test
def setup
@user = User.create(name: 'Bob', bio: '0' * 100_000)
@user2 = User.create(name: 'John', bsb: '111-111')
[*1..20].tap do |i|
c = @user.comments.find_or_create_by(body: "Hello #{i}")
c.update!(body: 'Hello again!')
end
@user_comments = []
@sql_requests_counter = perform_sql do
Comment.find_each do |c|
@user_comments << { c.body => c.user.name }
end
end
end
############### DON'T MODIFY AFTER THIS LINE ###############
def teardown
ActiveRecord::Base.subclasses.each(&:delete_all)
end
def perform_sql(tick: 0, &block)
counter_f = ->(*) { tick += 1 }
ActiveSupport::Notifications.subscribed(counter_f, 'sql.active_record', &block)
tick
end
def test_models
assert_equal 20, @user.comments_count
assert_equal 20, @user_comments.count
assert_includes [1, 2], @sql_requests_counter
end
def test_attributes
@user.update!(bsb: '999-999')
assert_equal '999-999', @user.bsb
assert_equal '111-111', @user2.bsb
end
def test_relations_polymorphic
@user.images.create(url: 'https://images.com/1.png')
assert_equal 1, Image.count
end
def test_user_status
@user.inactive!
assert_equal false, @user.active?
end
def test_destroy_relation
@user.destroy
assert_equal 0, Comment.count
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment