Last active
June 19, 2025 00:41
-
-
Save zolotyx/5f0aec85e69fa77160d5b7d8ac4f622e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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