# frozen_string_literal: true require "cases/helper" module ActiveRecord class Migration class CreateJoinTableTest < ActiveRecord::TestCase attr_reader :connection def setup super @connection = ActiveRecord::Base.connection end teardown do %w(artists_musics musics_videos catalog).each do |table_name| connection.drop_table table_name, if_exists: true end end def test_create_join_table connection.create_join_table :artists, :musics assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort end def test_create_join_table_set_not_null_by_default connection.create_join_table :artists, :musics assert_equal [false, false], connection.columns(:artists_musics).map(&:null) end def test_create_join_table_with_strings connection.create_join_table "artists", "musics" assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort end def test_create_join_table_with_symbol_and_string connection.create_join_table :artists, "musics" assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort end def test_create_join_table_with_the_proper_order connection.create_join_table :videos, :musics assert_equal %w(music_id video_id), connection.columns(:musics_videos).map(&:name).sort end def test_create_join_table_with_the_table_name connection.create_join_table :artists, :musics, table_name: :catalog assert_equal %w(artist_id music_id), connection.columns(:catalog).map(&:name).sort end def test_create_join_table_with_the_table_name_as_string connection.create_join_table :artists, :musics, table_name: "catalog" assert_equal %w(artist_id music_id), connection.columns(:catalog).map(&:name).sort end def test_create_join_table_with_column_options connection.create_join_table :artists, :musics, column_options: { null: true } assert_equal [true, true], connection.columns(:artists_musics).map(&:null) end def test_create_join_table_without_indexes connection.create_join_table :artists, :musics assert_predicate connection.indexes(:artists_musics), :blank? end def test_create_join_table_with_index connection.create_join_table :artists, :musics do |t| t.index [:artist_id, :music_id] end assert_equal [%w(artist_id music_id)], connection.indexes(:artists_musics).map(&:columns) end def test_create_join_table_respects_reference_key_type connection.create_join_table :artists, :musics do |t| t.references :video end artist_id, music_id, video_id = connection.columns(:artists_musics).sort_by(&:name) assert_equal video_id.sql_type, artist_id.sql_type assert_equal video_id.sql_type, music_id.sql_type end def test_drop_join_table connection.create_join_table :artists, :musics connection.drop_join_table :artists, :musics assert_not connection.table_exists?("artists_musics") end def test_drop_join_table_with_strings connection.create_join_table :artists, :musics connection.drop_join_table "artists", "musics" assert_not connection.table_exists?("artists_musics") end def test_drop_join_table_with_the_proper_order connection.create_join_table :videos, :musics connection.drop_join_table :videos, :musics assert_not connection.table_exists?("musics_videos") end def test_drop_join_table_with_the_table_name connection.create_join_table :artists, :musics, table_name: :catalog connection.drop_join_table :artists, :musics, table_name: :catalog assert_not connection.table_exists?("catalog") end def test_drop_join_table_with_the_table_name_as_string connection.create_join_table :artists, :musics, table_name: "catalog" connection.drop_join_table :artists, :musics, table_name: "catalog" assert_not connection.table_exists?("catalog") end def test_drop_join_table_with_column_options connection.create_join_table :artists, :musics, column_options: { null: true } connection.drop_join_table :artists, :musics, column_options: { null: true } assert_not connection.table_exists?("artists_musics") end def test_create_and_drop_join_table_with_common_prefix with_table_cleanup do connection.create_join_table "audio_artists", "audio_musics" assert connection.table_exists?("audio_artists_musics") connection.drop_join_table "audio_artists", "audio_musics" assert_not connection.table_exists?("audio_artists_musics"), "Should have dropped join table, but didn't" end end if current_adapter?(:PostgreSQLAdapter) def test_create_join_table_with_uuid connection.create_join_table :artists, :musics, column_options: { type: :uuid } assert_equal [:uuid, :uuid], connection.columns(:artists_musics).map(&:type) end end private def with_table_cleanup tables_before = connection.data_sources yield ensure tables_after = connection.data_sources - tables_before tables_after.each do |table| connection.drop_table table end end end end end