localtower 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -17
  3. data/app/controllers/localtower/pages_controller.rb +27 -12
  4. data/app/views/layouts/localtower/application.html.erb +16 -33
  5. data/app/views/localtower/pages/_alert_no_models.html.erb +3 -0
  6. data/app/views/localtower/pages/migrations.html.erb +52 -83
  7. data/app/views/localtower/pages/models.html.erb +53 -70
  8. data/app/views/localtower/pages/new_migration.html.erb +103 -0
  9. data/app/views/localtower/pages/new_model.html.erb +87 -0
  10. data/config/routes.rb +4 -4
  11. data/lib/localtower/generators/migration.rb +51 -120
  12. data/lib/localtower/generators/model.rb +52 -28
  13. data/lib/localtower/generators/service_objects/insert_array.rb +23 -0
  14. data/lib/localtower/generators/service_objects/insert_defaults.rb +15 -43
  15. data/lib/localtower/generators/service_objects/insert_indexes.rb +80 -0
  16. data/lib/localtower/generators/service_objects/insert_nullable.rb +23 -0
  17. data/lib/localtower/status.rb +1 -1
  18. data/lib/localtower/tools.rb +13 -16
  19. data/lib/localtower/version.rb +1 -1
  20. data/public/css/app.css +0 -49
  21. data/public/js/app.js +215 -70
  22. data/public/screenshots/v1.0.0/migrations.png +0 -0
  23. data/public/screenshots/v1.0.0/models.png +0 -0
  24. data/public/screenshots/v1.0.0/new_migration.png +0 -0
  25. data/public/screenshots/v1.0.0/new_model.png +0 -0
  26. data/spec/dummy/Gemfile +0 -2
  27. data/spec/dummy/Gemfile.lock +1 -10
  28. data/spec/dummy/app/models/post.rb +3 -0
  29. data/spec/dummy/app/models/user.rb +1 -0
  30. data/spec/dummy/config/environments/development.rb +1 -0
  31. data/spec/dummy/config/puma.rb +1 -1
  32. data/spec/dummy/db/migrate/20230119221452_create_users.rb +14 -0
  33. data/spec/dummy/db/migrate/20230119221751_change_users_at1674166670.rb +7 -0
  34. data/spec/dummy/db/migrate/20230119222054_create_posts.rb +11 -0
  35. data/spec/dummy/db/migrate/20230119222106_change_posts_at1674166865.rb +5 -0
  36. data/spec/dummy/db/schema.rb +20 -8
  37. data/spec/dummy/log/development.log +15281 -3345
  38. data/spec/dummy/log/localtower.log +1897 -132
  39. data/spec/dummy/log/test.log +0 -0
  40. data/spec/dummy/test/index.html +38 -0
  41. data/spec/dummy/tmp/pids/server.pid +1 -0
  42. data/spec/factories/migration.rb +25 -41
  43. data/spec/factories/model.rb +39 -25
  44. data/spec/lib/localtower/generators/migration_spec.rb +36 -63
  45. data/spec/lib/localtower/generators/model_spec.rb +43 -34
  46. data/spec/lib/localtower/generators/service_objects/insert_array_spec.rb +47 -0
  47. data/spec/lib/localtower/generators/service_objects/insert_defaults_spec.rb +30 -35
  48. data/spec/lib/localtower/generators/service_objects/insert_indexes_spec.rb +90 -0
  49. data/spec/lib/localtower/generators/service_objects/insert_nullable_spec.rb +61 -0
  50. data/spec/lib/localtower/tools_spec.rb +1 -11
  51. data/spec/spec_helper.rb +8 -3
  52. metadata +34 -18
  53. data/app/views/localtower/pages/_migrations.html.erb +0 -57
  54. data/app/views/localtower/pages/schema.html.erb +0 -67
  55. data/spec/dummy/db/migrate/20221115190039_create_users.rb +0 -13
  56. data/spec/dummy/db/migrate/20221115193020_change_users.rb +0 -8
  57. data/spec/dummy/db/migrate/20221115193532_change_users_at1668540931.rb +0 -5
  58. data/spec/dummy/db/migrate/20221115193605_change_users_at1668540964.rb +0 -5
  59. data/spec/dummy/db/migrate/20221115193637_change_users_at1668540996.rb +0 -5
  60. data/spec/dummy/db/migrate/20221115193642_change_users_at1668541001.rb +0 -5
  61. data/spec/lib/localtower/generators/relation_spec.rb +0 -65
File without changes
@@ -0,0 +1,38 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <script src="https://cdn.tailwindcss.com"></script>
7
+ <script>
8
+ tailwind.config = {
9
+ theme: {
10
+ extend: {
11
+ colors: {
12
+ clifford: '#da373d',
13
+ }
14
+ }
15
+ }
16
+ }
17
+ </script>
18
+ <style type="text/tailwindcss">
19
+ @layer utilities {
20
+ .content-auto {
21
+ content-visibility: auto;
22
+ }
23
+
24
+ .nude {
25
+ @apply text-green-500;
26
+
27
+ }
28
+ }
29
+ </style>
30
+ </head>
31
+ <body>
32
+ <div class="container mx-auto">
33
+ <h1 class="nude text-3xl font-bold underline">
34
+ Hello world!
35
+ </h1>
36
+ </div>
37
+ </body>
38
+ </html>
@@ -0,0 +1 @@
1
+ 67242
@@ -1,28 +1,4 @@
1
1
  FactoryBot.define do
2
- factory :create_table, class: "Hash" do
3
- migration_name { "Post" }
4
- migrations do
5
- [
6
- {
7
- action: "create_table",
8
- table_name: "posts"
9
- }
10
- ]
11
- end
12
- end
13
-
14
- factory :create_table_two, class: "Hash" do
15
- migration_name { "User" }
16
- migrations do
17
- [
18
- {
19
- action: "create_table",
20
- table_name: "users"
21
- }
22
- ]
23
- end
24
- end
25
-
26
2
  factory :add_column, class: "Hash" do
27
3
  migration_name { "Post" }
28
4
  migrations do
@@ -32,7 +8,6 @@ FactoryBot.define do
32
8
  table_name: "posts",
33
9
  column: "title",
34
10
  column_type: "string",
35
- index: true,
36
11
  nullable: true,
37
12
  },
38
13
  {
@@ -40,7 +15,6 @@ FactoryBot.define do
40
15
  table_name: "posts",
41
16
  column: "content",
42
17
  column_type: "text",
43
- index: false,
44
18
  nullable: true,
45
19
  },
46
20
  {
@@ -64,20 +38,6 @@ FactoryBot.define do
64
38
  end
65
39
  end
66
40
 
67
- factory :add_column_fail, class: "Hash" do
68
- migration_name { "Post" }
69
- migrations do
70
- [
71
- {
72
- action: "add_column",
73
- table_name: "posts",
74
- column: "title",
75
- # column_type: "string",
76
- }
77
- ]
78
- end
79
- end
80
-
81
41
  factory :rename_column, class: "Hash" do
82
42
  migration_name { "Post" }
83
43
  migrations do
@@ -134,10 +94,34 @@ FactoryBot.define do
134
94
  migration_name { "Post" }
135
95
  migrations do
136
96
  [
97
+ {
98
+ action: "add_column",
99
+ table_name: "posts",
100
+ column: "content",
101
+ column_type: "text",
102
+ },
137
103
  {
138
104
  action: "add_index_to_column",
139
105
  table_name: "posts",
140
- column: "content_new",
106
+ column: "content",
107
+ },
108
+ {
109
+ action: "add_index_to_column",
110
+ table_name: "posts",
111
+ column: "content_second",
112
+ index: {
113
+ using: 'default',
114
+ unique: true,
115
+ }
116
+ },
117
+ {
118
+ action: "add_index_to_column",
119
+ table_name: "posts",
120
+ column: "content_third",
121
+ index: {
122
+ using: 'gin',
123
+ algorithm: 'concurrently',
124
+ }
141
125
  }
142
126
  ]
143
127
  end
@@ -1,40 +1,54 @@
1
1
  FactoryBot.define do
2
- factory :post_one, class: "Hash" do
3
- model_name { "Post" }
2
+ factory :post_one, class: Hash do
3
+ model_name { 'Post' }
4
4
  attributes do
5
5
  [
6
6
  {
7
- attribute_name: "title",
8
- attribute_type: "string",
9
- index: true
7
+ 'attribute_name' => 'title',
8
+ 'attribute_type' => 'string',
9
+ 'index' => {
10
+ 'using' => 'default',
11
+ 'unique' => true,
12
+ 'algorithm' => 'default',
13
+ }
10
14
  },
11
15
  {
12
- attribute_name: "content",
13
- attribute_type: "text"
16
+ 'attribute_name' => 'tags',
17
+ 'attribute_type' => 'array',
18
+ 'nullable' => false,
19
+ 'default' => '[]',
20
+ 'index' => {
21
+ 'using' => 'gin',
22
+ 'unique' => true,
23
+ 'algorithm' => 'concurrently',
24
+ }
14
25
  },
15
- ]
16
- end
17
- end
18
-
19
- factory :user_one, class: "Hash" do
20
- model_name { "User" }
21
- attributes do
22
- [
23
26
  {
24
- attribute_name: "name",
25
- attribute_type: "string",
26
- index: true,
27
+ 'attribute_name' => 'content',
28
+ 'attribute_type' => 'text',
29
+ 'nullable' => false,
30
+ 'index' => {
31
+ 'using' => 'gist',
32
+ 'algorithm' => 'default',
33
+ }
27
34
  },
28
35
  {
29
- attribute_name: "metadata",
30
- attribute_type: "jsonb"
36
+ 'attribute_name' => 'likes_count',
37
+ 'attribute_type' => 'integer',
38
+ 'nullable' => true,
39
+ 'default' => '0',
40
+ },
41
+ {
42
+ 'attribute_name' => 'score',
43
+ 'attribute_type' => 'float',
44
+ },
45
+ {
46
+ 'attribute_name' => 'metadata',
47
+ 'attribute_type' => 'jsonb',
48
+ 'nullable' => false,
49
+ 'default' => '{}',
31
50
  },
32
51
  ]
33
52
  end
34
53
  end
35
-
36
- factory :relation_one, class: "Hash" do
37
- model_one_name { "User" }
38
- model_two_name { "Post" }
39
- end
40
54
  end
@@ -3,111 +3,84 @@ require 'spec_helper'
3
3
  module Localtower
4
4
  module Generators
5
5
  describe Migration do
6
- before(:all) do
7
- clean_files
8
- end
9
-
10
- after(:all) do
11
- end
12
-
13
- it 'create_table' do
14
- data = attributes_for(:create_table)
15
- data["run_migrate"] = true
16
-
17
- generator = ::Localtower::Generators::Migration.new(data).run
18
-
19
- expect(::Localtower::Tools.word_in_file?(last_migration, /create_table :posts/)).to eq(true)
20
- end
21
-
22
- it 'create_table_two' do
23
- data = attributes_for(:create_table_two)
24
- data["run_migrate"] = true
25
-
26
- generator = ::Localtower::Generators::Migration.new(data).run
27
-
28
- expect(::Localtower::Tools.word_in_file?(last_migration, /create_table :users/)).to eq(true)
29
- end
30
-
31
6
  it 'add_column' do
32
- data = attributes_for(:add_column)
33
- data["run_migrate"] = true
7
+ data = attributes_for(:add_column)[:migrations]
34
8
 
35
9
  generator = ::Localtower::Generators::Migration.new(data).run
36
10
 
37
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :tags, :text, default: \[\], array: true/)).to eq(true)
38
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :tags, using: :gin/)).to eq(true)
39
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :views, :integer, default: 0, null: false, index: true/)).to eq(true)
40
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :content, :text/)).to eq(true)
41
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :title, :string, index: true/)).to eq(true)
11
+ expect(word_in_file?(last_migration, /add_column :posts, :tags, :string, default: \[\], array: true/)).to eq(true)
12
+ expect(word_in_file?(last_migration, /add_column :posts, :views, :integer, default: 0, null: false/)).to eq(true)
13
+ expect(word_in_file?(last_migration, /add_column :posts, :content, :text/)).to eq(true)
14
+ expect(word_in_file?(last_migration, /add_column :posts, :title, :string/)).to eq(true)
42
15
  end
43
16
 
44
- it 'add_column fail' do
45
- data = attributes_for(:add_column_fail)
46
- data["run_migrate"] = true
17
+ it 'remove_column' do
18
+ data = attributes_for(:remove_column)[:migrations]
47
19
 
48
20
  generator = ::Localtower::Generators::Migration.new(data).run
49
21
 
50
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :tags, :text, default: \[\], array: true/)).to eq(false)
51
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :tags, using: :gin/)).to eq(false)
52
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :views, :integer, default: 0, null: false, index: true/)).to eq(false)
53
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :content, :text/)).to eq(false)
54
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_column :posts, :title, :string, index: true/)).to eq(false)
22
+ expect(word_in_file?(last_migration, /remove_column :posts, :title/)).to eq(true)
23
+ expect(word_in_file?(last_migration, /rename_column :posts, :views, :views_by_users/)).to eq(true)
55
24
  end
56
25
 
57
26
  it 'rename_column' do
58
- data = attributes_for(:rename_column)
59
- data["run_migrate"] = true
27
+ data = attributes_for(:rename_column)[:migrations]
60
28
 
61
29
  generator = ::Localtower::Generators::Migration.new(data).run
62
30
 
63
- expect(::Localtower::Tools.word_in_file?(last_migration, /rename_column :posts, :content, :content_new/)).to eq(true)
31
+ expect(word_in_file?(last_migration, /rename_column :posts, :content, :content_new/)).to eq(true)
64
32
  end
65
33
 
66
- it 'remove_column' do
67
- data = attributes_for(:remove_column)
68
- data["run_migrate"] = true
34
+ it 'change_column_type' do
35
+ data = attributes_for(:change_column_type)[:migrations]
69
36
 
70
37
  generator = ::Localtower::Generators::Migration.new(data).run
71
38
 
72
- expect(::Localtower::Tools.word_in_file?(last_migration, /remove_column :posts, :title/)).to eq(true)
73
- expect(::Localtower::Tools.word_in_file?(last_migration, /rename_column :posts, :views, :views_by_users/)).to eq(true)
39
+ expect(word_in_file?(last_migration, /add_index :posts, :views_by_users/)).to eq(true)
40
+ expect(word_in_file?(last_migration, /change_column :posts, :content_new, :string/)).to eq(true)
74
41
  end
75
42
 
76
- it 'change_column_type' do
77
- data = attributes_for(:change_column_type)
78
- data["run_migrate"] = true
43
+ it 'add_index_to_column' do
44
+ data = attributes_for(:add_index_to_column)[:migrations]
79
45
 
80
46
  generator = ::Localtower::Generators::Migration.new(data).run
81
47
 
82
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :views_by_users/)).to eq(true)
83
- expect(::Localtower::Tools.word_in_file?(last_migration, /change_column :posts, :content_new, :string/)).to eq(true)
48
+ expect(word_in_file?(last_migration, /disable_ddl_transaction!/)).to eq(true)
49
+ expect(word_in_file?(last_migration, /add_index :posts, :content/)).to eq(true)
50
+ expect(word_in_file?(last_migration, /add_index :posts, :content_second, unique: true/)).to eq(true)
51
+ expect(word_in_file?(last_migration, /add_index :posts, :content_third, using: :gin, algorithm: :concurrently/)).to eq(true)
84
52
  end
85
53
 
86
- it 'add_index_to_column' do
87
- data = attributes_for(:add_index_to_column)
88
- data["run_migrate"] = true
54
+ it 'belongs_to' do
55
+ data = attributes_for(:belongs_to)[:migrations]
56
+
57
+ model_post = "#{Rails.root}/app/models/post.rb"
58
+ model_user = "#{Rails.root}/app/models/user.rb"
59
+
60
+ File.open(model_post, 'w') { |f| f.write("class Post < ApplicationRecord\nend")}
61
+ File.open(model_user, 'w') { |f| f.write("class User < ApplicationRecord\nend")}
89
62
 
90
63
  generator = ::Localtower::Generators::Migration.new(data).run
91
64
 
92
- expect(::Localtower::Tools.word_in_file?(last_migration, /add_index :posts, :content_new/)).to eq(true)
65
+ expect(word_in_file?(model_post, /# belongs_to :user/)).to eq(true)
66
+ expect(word_in_file?(model_user, /# has_many :posts/)).to eq(true)
67
+ expect(word_in_file?(last_migration, /add_reference :posts, :user, foreign_key: true, index: true/)).to eq(true)
93
68
  end
94
69
 
95
70
  it 'remove_index_to_column' do
96
- data = attributes_for(:remove_index_to_column)
97
- data["run_migrate"] = true
71
+ data = attributes_for(:remove_index_to_column)[:migrations]
98
72
 
99
73
  generator = ::Localtower::Generators::Migration.new(data).run
100
74
 
101
- expect(::Localtower::Tools.word_in_file?(last_migration, /remove_index :posts, :views_by_users/)).to eq(true)
75
+ expect(word_in_file?(last_migration, /remove_index :posts, :views_by_users/)).to eq(true)
102
76
  end
103
77
 
104
78
  it 'drop_table' do
105
- data = attributes_for(:drop_table)
106
- data["run_migrate"] = true
79
+ data = attributes_for(:drop_table)[:migrations]
107
80
 
108
81
  generator = ::Localtower::Generators::Migration.new(data).run
109
82
 
110
- expect(::Localtower::Tools.word_in_file?(last_migration, /drop_table :posts, force: :cascade/)).to eq(true)
83
+ expect(word_in_file?(last_migration, /drop_table :posts/)).to eq(true)
111
84
  end
112
85
  end
113
86
  end
@@ -3,40 +3,49 @@ require 'spec_helper'
3
3
  module Localtower
4
4
  module Generators
5
5
  describe Model do
6
- before(:all) do
7
- clean_files
8
- end
9
-
10
- after(:all) do
11
- end
12
-
13
- it 'create a post' do
14
- data = attributes_for(:post_one)
15
- data["run_migrate"] = true
16
-
17
- ::Localtower::Generators::Model.new(data).run
18
-
19
- expect(File.exist?("#{Rails.root}/app/models/post.rb")).to eq(true)
20
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/app/models/post.rb", /class Post/)).to eq(true)
21
-
22
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /create_table "posts"/)).to eq(true)
23
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.string(.*)"title"/)).to eq(true)
24
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.text(.*)"content"/)).to eq(true)
25
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.index(.*)\["title"\], name: "index_posts_on_title"/)).to eq(true)
26
- end
27
-
28
- it 'create a user' do
29
- data = attributes_for(:user_one)
30
- data["run_migrate"] = true
31
-
32
- ::Localtower::Generators::Model.new(data).run
33
-
34
- expect(File.exist?("#{Rails.root}/app/models/user.rb")).to eq(true)
35
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/app/models/user.rb", /class User/)).to eq(true)
36
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /create_table "users"/)).to eq(true)
37
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.string(.*)"name"/)).to eq(true)
38
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.jsonb(.*)"metadata"/)).to eq(true)
39
- expect(::Localtower::Tools.word_in_file?("#{Rails.root}/db/schema.rb", /t.index(.*)\["name"\], name: "index_users_on_name"/)).to eq(true)
6
+ context 'model 1' do
7
+ let(:expected_migration) do
8
+ <<-TEXT_MULTILINE.strip_heredoc
9
+ class CreatePosts < ActiveRecord::Migration[5.2]
10
+ disable_ddl_transaction!
11
+
12
+ def change
13
+ create_table :posts do |t|
14
+ t.string :title
15
+ t.string :tags, array: true, default: [], null: false
16
+ t.text :content, null: false
17
+ t.integer :likes_count, default: 0
18
+ t.float :score
19
+ t.jsonb :metadata, default: {}, null: false
20
+
21
+ t.timestamps
22
+ end
23
+ add_index :posts, :title, unique: true
24
+ add_index :posts, :tags, using: :gin, unique: true, algorithm: :concurrently
25
+ add_index :posts, :content, using: :gist
26
+ add_index :posts, :likes_count
27
+ add_index :posts, :score
28
+ add_index :posts, :metadata
29
+ end
30
+ end
31
+ TEXT_MULTILINE
32
+ end
33
+
34
+ let(:expected_model) do
35
+ <<-TEXT_MULTILINE.strip_heredoc
36
+ class Post < ApplicationRecord
37
+ end
38
+ TEXT_MULTILINE
39
+ end
40
+
41
+ let(:attributes) { attributes_for(:post_one).deep_stringify_keys }
42
+
43
+ it 'create a post' do
44
+ ::Localtower::Generators::Model.new(attributes).run
45
+
46
+ expect(File.read("#{Rails.root}/app/models/post.rb")).to eq(expected_model)
47
+ expect(File.read(last_migration)).to eq(expected_migration)
48
+ end
40
49
  end
41
50
  end
42
51
  end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Localtower::Generators::ServiceObjects::InsertArray do
4
+ let(:service) { described_class.new(attributes) }
5
+
6
+ let(:attributes) {
7
+ ['tags']
8
+ }
9
+
10
+ let(:base_file_content) {
11
+ <<-MIGRATION.strip_heredoc
12
+ class CreateTests < ActiveRecord::Migration[7.0]
13
+ def change
14
+ create_table :tests do |t|
15
+ t.string :tags
16
+
17
+ t.timestamps
18
+ end
19
+ end
20
+ end
21
+ MIGRATION
22
+ }
23
+
24
+ let(:expected_file_content) {
25
+ <<-MIGRATION.strip_heredoc
26
+ class CreateTests < ActiveRecord::Migration[7.0]
27
+ def change
28
+ create_table :tests do |t|
29
+ t.string :tags, array: true
30
+
31
+ t.timestamps
32
+ end
33
+ end
34
+ end
35
+ MIGRATION
36
+ }
37
+
38
+ before do
39
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
40
+ end
41
+
42
+ it 'works' do
43
+ service.call
44
+
45
+ expect(File.read(last_migration)).to eq(expected_file_content)
46
+ end
47
+ end
@@ -1,32 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ::Localtower::Generators::ServiceObjects::InsertDefaults do
4
-
5
- let(:latest_migration) do
6
- Tempfile.new('foo').tap do |file|
7
- file.puts base_file_content
8
- file.rewind
9
- end
10
- end
4
+ let(:service) { described_class.new(attributes) }
11
5
 
12
6
  let(:attributes) {
13
7
  [
14
- { 'first' => "true" },
15
- { 'third' => "nil" },
8
+ { 'first' => "true" },
9
+ { 'third' => "nil" },
16
10
  { 'fourth' => "false" },
17
- { 'fifth' => "0" }
11
+ { 'foo' => "{}" },
12
+ { 'fifth' => "0" }
18
13
  ]
19
14
  }
20
15
 
21
16
  let(:base_file_content) {
22
17
  <<-MIGRATION.strip_heredoc
23
- class CreateTests < ActiveRecord::Migration[5.0]
18
+ class CreateTests < ActiveRecord::Migration[7.0]
24
19
  def change
25
20
  create_table :tests do |t|
26
21
  t.string :first
27
22
  t.integer :second
28
23
  t.string :third
29
24
  t.string :fourth
25
+ t.jsonb :foo
30
26
  t.integer :fifth
31
27
 
32
28
  t.timestamps
@@ -37,34 +33,33 @@ describe ::Localtower::Generators::ServiceObjects::InsertDefaults do
37
33
  MIGRATION
38
34
  }
39
35
 
40
- let(:expected_file_structure_array) {
41
- [
42
- "class CreateTests < ActiveRecord::Migration[5.0]\n",
43
- " def change\n",
44
- " create_table :tests do |t|\n",
45
- " t.string :first, default: true\n",
46
- " t.integer :second\n",
47
- " t.string :third, default: nil\n",
48
- " t.string :fourth, default: false\n",
49
- " t.integer :fifth, default: 0\n",
50
- "\n",
51
- " t.timestamps\n",
52
- " end\n",
53
- " add_index :tests, :first\n",
54
- " end\n",
55
- "end\n"
56
- ]
57
- }
36
+ let(:expected_file_content) {
37
+ <<-MIGRATION.strip_heredoc
38
+ class CreateTests < ActiveRecord::Migration[7.0]
39
+ def change
40
+ create_table :tests do |t|
41
+ t.string :first, default: true
42
+ t.integer :second
43
+ t.string :third, default: nil
44
+ t.string :fourth, default: false
45
+ t.jsonb :foo, default: {}
46
+ t.integer :fifth, default: 0
58
47
 
59
- let(:service) { described_class.new(attributes) }
48
+ t.timestamps
49
+ end
50
+ add_index :tests, :first
51
+ end
52
+ end
53
+ MIGRATION
54
+ }
60
55
 
61
56
  before do
62
- allow(service).to receive(:latest_migration).and_return(latest_migration)
63
- service.call
57
+ File.open("#{Rails.root}/db/migrate/0_migration_name_.rb", 'w') { |f| f.write(base_file_content) }
64
58
  end
65
59
 
66
- it 'inserts default values for attributes' do
67
- lines_array = File.readlines(latest_migration)
68
- expect(lines_array).to match_array expected_file_structure_array
60
+ it 'works' do
61
+ service.call
62
+
63
+ expect(File.read(last_migration)).to eq(expected_file_content)
69
64
  end
70
65
  end