From 4c00c6ed230e6fdc6199dfba43f6da1e741a02aa Mon Sep 17 00:00:00 2001
From: Kir Shatrov <shatrov@me.com>
Date: Sun, 13 Nov 2016 22:18:14 -0500
Subject: Use YAML to serialize schema cache

---
 activerecord/test/assets/schema_dump_5_1.yml       | 345 +++++++++++++++++++++
 .../cases/connection_adapters/schema_cache_test.rb |  43 ++-
 2 files changed, 384 insertions(+), 4 deletions(-)
 create mode 100644 activerecord/test/assets/schema_dump_5_1.yml

(limited to 'activerecord/test')

diff --git a/activerecord/test/assets/schema_dump_5_1.yml b/activerecord/test/assets/schema_dump_5_1.yml
new file mode 100644
index 0000000000..f37977daf2
--- /dev/null
+++ b/activerecord/test/assets/schema_dump_5_1.yml
@@ -0,0 +1,345 @@
+--- !ruby/object:ActiveRecord::ConnectionAdapters::SchemaCache
+columns:
+  posts:
+  - &1 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: id
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: INTEGER
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': false
+    default: 
+    default_function: 
+    collation: 
+    comment: 
+  - &2 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: author_id
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: 
+    default_function: 
+    collation: 
+    comment: 
+  - &3 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: title
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: varchar
+      type: :string
+      limit: 
+      precision: 
+      scale: 
+    'null': false
+    default: 
+    default_function: 
+    collation: 
+    comment: 
+  - &4 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: body
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: text
+      type: :text
+      limit: 
+      precision: 
+      scale: 
+    'null': false
+    default: 
+    default_function: 
+    collation: 
+    comment: 
+  - &5 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: type
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: varchar
+      type: :string
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: 
+    default_function: 
+    collation: 
+    comment: 
+  - &6 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: comments_count
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: '0'
+    default_function: 
+    collation: 
+    comment: 
+  - &7 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: taggings_with_delete_all_count
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: '0'
+    default_function: 
+    collation: 
+    comment: 
+  - &8 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: taggings_with_destroy_count
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: '0'
+    default_function: 
+    collation: 
+    comment: 
+  - &9 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: tags_count
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: '0'
+    default_function: 
+    collation: 
+    comment: 
+  - &10 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: tags_with_destroy_count
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: '0'
+    default_function: 
+    collation: 
+    comment: 
+  - &11 !ruby/object:ActiveRecord::ConnectionAdapters::Column
+    name: tags_with_nullify_count
+    table_name: posts
+    sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata
+      sql_type: integer
+      type: :integer
+      limit: 
+      precision: 
+      scale: 
+    'null': true
+    default: '0'
+    default_function: 
+    collation: 
+    comment: 
+columns_hash:
+  posts:
+    id: *1
+    author_id: *2
+    title: *3
+    body: *4
+    type: *5
+    comments_count: *6
+    taggings_with_delete_all_count: *7
+    taggings_with_destroy_count: *8
+    tags_count: *9
+    tags_with_destroy_count: *10
+    tags_with_nullify_count: *11
+primary_keys:
+  posts: id
+data_sources:
+  ar_internal_metadata: true
+  table_with_autoincrement: true
+  accounts: true
+  admin_accounts: true
+  admin_users: true
+  aircraft: true
+  articles: true
+  articles_magazines: true
+  articles_tags: true
+  audit_logs: true
+  authors: true
+  author_addresses: true
+  author_favorites: true
+  auto_id_tests: true
+  binaries: true
+  birds: true
+  books: true
+  booleans: true
+  bulbs: true
+  CamelCase: true
+  cars: true
+  carriers: true
+  categories: true
+  categories_posts: true
+  categorizations: true
+  citations: true
+  clubs: true
+  collections: true
+  colnametests: true
+  columns: true
+  comments: true
+  companies: true
+  content: true
+  content_positions: true
+  vegetables: true
+  computers: true
+  computers_developers: true
+  contracts: true
+  customers: true
+  customer_carriers: true
+  dashboards: true
+  developers: true
+  developers_projects: true
+  dog_lovers: true
+  dogs: true
+  doubloons: true
+  edges: true
+  engines: true
+  entrants: true
+  essays: true
+  events: true
+  eyes: true
+  funny_jokes: true
+  cold_jokes: true
+  friendships: true
+  goofy_string_id: true
+  having: true
+  guids: true
+  guitars: true
+  inept_wizards: true
+  integer_limits: true
+  invoices: true
+  iris: true
+  items: true
+  jobs: true
+  jobs_pool: true
+  keyboards: true
+  legacy_things: true
+  lessons: true
+  lessons_students: true
+  students: true
+  lint_models: true
+  line_items: true
+  lions: true
+  lock_without_defaults: true
+  lock_without_defaults_cust: true
+  magazines: true
+  mateys: true
+  members: true
+  member_details: true
+  member_friends: true
+  memberships: true
+  member_types: true
+  mentors: true
+  minivans: true
+  minimalistics: true
+  mixed_case_monkeys: true
+  mixins: true
+  movies: true
+  notifications: true
+  numeric_data: true
+  orders: true
+  organizations: true
+  owners: true
+  paint_colors: true
+  paint_textures: true
+  parrots: true
+  parrots_pirates: true
+  parrots_treasures: true
+  people: true
+  peoples_treasures: true
+  personal_legacy_things: true
+  pets: true
+  pets_treasures: true
+  pirates: true
+  posts: true
+  serialized_posts: true
+  images: true
+  price_estimates: true
+  products: true
+  product_types: true
+  projects: true
+  randomly_named_table1: true
+  randomly_named_table2: true
+  randomly_named_table3: true
+  ratings: true
+  readers: true
+  references: true
+  shape_expressions: true
+  ships: true
+  ship_parts: true
+  prisoners: true
+  shop_accounts: true
+  speedometers: true
+  sponsors: true
+  string_key_objects: true
+  subscribers: true
+  subscriptions: true
+  tags: true
+  taggings: true
+  tasks: true
+  topics: true
+  toys: true
+  traffic_lights: true
+  treasures: true
+  tuning_pegs: true
+  tyres: true
+  variants: true
+  vertices: true
+  warehouse-things: true
+  circles: true
+  squares: true
+  triangles: true
+  non_poly_ones: true
+  non_poly_twos: true
+  men: true
+  faces: true
+  interests: true
+  zines: true
+  wheels: true
+  countries: true
+  treaties: true
+  countries_treaties: true
+  liquid: true
+  molecules: true
+  electrons: true
+  weirds: true
+  nodes: true
+  trees: true
+  hotels: true
+  departments: true
+  cake_designers: true
+  drink_designers: true
+  chefs: true
+  recipes: true
+  records: true
+  overloaded_types: true
+  users: true
+  test_with_keyword_column_name: true
+  fk_test_has_pk: true
+  fk_test_has_fk: true
+version: 0
diff --git a/activerecord/test/cases/connection_adapters/schema_cache_test.rb b/activerecord/test/cases/connection_adapters/schema_cache_test.rb
index d4459603af..1b4f80fc67 100644
--- a/activerecord/test/cases/connection_adapters/schema_cache_test.rb
+++ b/activerecord/test/cases/connection_adapters/schema_cache_test.rb
@@ -12,6 +12,33 @@ module ActiveRecord
         assert_equal "id", @cache.primary_keys("posts")
       end
 
+      def test_yaml_dump_and_load
+        @cache.columns("posts")
+        @cache.columns_hash("posts")
+        @cache.data_sources("posts")
+        @cache.primary_keys("posts")
+
+        new_cache = YAML.load(YAML.dump(@cache))
+        assert_no_queries do
+          assert_equal 11, new_cache.columns("posts").size
+          assert_equal 11, new_cache.columns_hash("posts").size
+          assert new_cache.data_sources("posts")
+          assert_equal "id", new_cache.primary_keys("posts")
+        end
+      end
+
+      def test_yaml_loads_5_1_dump
+        body = File.open(schema_dump_path).read
+        cache = YAML.load(body)
+
+        assert_no_queries do
+          assert_equal 11, cache.columns("posts").size
+          assert_equal 11, cache.columns_hash("posts").size
+          assert cache.data_sources("posts")
+          assert_equal "id", cache.primary_keys("posts")
+        end
+      end
+
       def test_primary_key_for_non_existent_table
         assert_nil @cache.primary_keys("omgponies")
       end
@@ -45,10 +72,12 @@ module ActiveRecord
 
         @cache = Marshal.load(Marshal.dump(@cache))
 
-        assert_equal 11, @cache.columns("posts").size
-        assert_equal 11, @cache.columns_hash("posts").size
-        assert @cache.data_sources("posts")
-        assert_equal "id", @cache.primary_keys("posts")
+        assert_no_queries do
+          assert_equal 11, @cache.columns("posts").size
+          assert_equal 11, @cache.columns_hash("posts").size
+          assert @cache.data_sources("posts")
+          assert_equal "id", @cache.primary_keys("posts")
+        end
       end
 
       def test_table_methods_deprecation
@@ -56,6 +85,12 @@ module ActiveRecord
         assert_deprecated { assert @cache.tables("posts") }
         assert_deprecated { @cache.clear_table_cache!("posts") }
       end
+
+      private
+
+        def schema_dump_path
+          "test/assets/schema_dump_5_1.yml"
+        end
     end
   end
 end
-- 
cgit v1.2.3