tennpipes-init 3.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.rdoc +163 -0
  4. data/Rakefile +1 -0
  5. data/bin/tennpipes-init +16 -0
  6. data/lib/tennpipes-init.rb +73 -0
  7. data/lib/tennpipes-init/command.rb +18 -0
  8. data/lib/tennpipes-init/generators/actions.rb +630 -0
  9. data/lib/tennpipes-init/generators/app.rb +75 -0
  10. data/lib/tennpipes-init/generators/app/app.rb.tt +72 -0
  11. data/lib/tennpipes-init/generators/app/app.rb.tt~ +72 -0
  12. data/lib/tennpipes-init/generators/cli.rb +57 -0
  13. data/lib/tennpipes-init/generators/component.rb +73 -0
  14. data/lib/tennpipes-init/generators/components/actions.rb +208 -0
  15. data/lib/tennpipes-init/generators/components/mocks/mocha.rb +10 -0
  16. data/lib/tennpipes-init/generators/components/mocks/rr.rb +13 -0
  17. data/lib/tennpipes-init/generators/components/orms/activerecord.rb +201 -0
  18. data/lib/tennpipes-init/generators/components/orms/couchrest.rb +55 -0
  19. data/lib/tennpipes-init/generators/components/orms/datamapper.rb +140 -0
  20. data/lib/tennpipes-init/generators/components/orms/dynamoid.rb +67 -0
  21. data/lib/tennpipes-init/generators/components/orms/minirecord.rb +165 -0
  22. data/lib/tennpipes-init/generators/components/orms/mongoid.rb +113 -0
  23. data/lib/tennpipes-init/generators/components/orms/mongomapper.rb +43 -0
  24. data/lib/tennpipes-init/generators/components/orms/mongomatic.rb +84 -0
  25. data/lib/tennpipes-init/generators/components/orms/ohm.rb +65 -0
  26. data/lib/tennpipes-init/generators/components/orms/ripple.rb +75 -0
  27. data/lib/tennpipes-init/generators/components/orms/sequel.rb +99 -0
  28. data/lib/tennpipes-init/generators/components/renderers/erb.rb +3 -0
  29. data/lib/tennpipes-init/generators/components/renderers/haml.rb +3 -0
  30. data/lib/tennpipes-init/generators/components/renderers/liquid.rb +4 -0
  31. data/lib/tennpipes-init/generators/components/renderers/slim.rb +3 -0
  32. data/lib/tennpipes-init/generators/components/scripts/dojo.rb +10 -0
  33. data/lib/tennpipes-init/generators/components/scripts/extcore.rb +10 -0
  34. data/lib/tennpipes-init/generators/components/scripts/jquery.rb +10 -0
  35. data/lib/tennpipes-init/generators/components/scripts/mootools.rb +10 -0
  36. data/lib/tennpipes-init/generators/components/scripts/prototype.rb +12 -0
  37. data/lib/tennpipes-init/generators/components/scripts/rightjs.rb +10 -0
  38. data/lib/tennpipes-init/generators/components/stylesheets/compass.rb +39 -0
  39. data/lib/tennpipes-init/generators/components/stylesheets/compass/application.scss +43 -0
  40. data/lib/tennpipes-init/generators/components/stylesheets/compass/partials/_base.scss +12 -0
  41. data/lib/tennpipes-init/generators/components/stylesheets/less.rb +25 -0
  42. data/lib/tennpipes-init/generators/components/stylesheets/sass.rb +15 -0
  43. data/lib/tennpipes-init/generators/components/stylesheets/scss.rb +16 -0
  44. data/lib/tennpipes-init/generators/components/tests/bacon.rb +103 -0
  45. data/lib/tennpipes-init/generators/components/tests/cucumber.rb +86 -0
  46. data/lib/tennpipes-init/generators/components/tests/minitest.rb +110 -0
  47. data/lib/tennpipes-init/generators/components/tests/riot.rb +117 -0
  48. data/lib/tennpipes-init/generators/components/tests/rspec.rb +111 -0
  49. data/lib/tennpipes-init/generators/components/tests/shoulda.rb +114 -0
  50. data/lib/tennpipes-init/generators/components/tests/steak.rb +114 -0
  51. data/lib/tennpipes-init/generators/controller.rb +77 -0
  52. data/lib/tennpipes-init/generators/helper.rb +50 -0
  53. data/lib/tennpipes-init/generators/mailer.rb +52 -0
  54. data/lib/tennpipes-init/generators/migration.rb +43 -0
  55. data/lib/tennpipes-init/generators/model.rb +113 -0
  56. data/lib/tennpipes-init/generators/plugin.rb +67 -0
  57. data/lib/tennpipes-init/generators/project.rb +160 -0
  58. data/lib/tennpipes-init/generators/project/config.ru +9 -0
  59. data/lib/tennpipes-init/generators/project/config/apps.rb.tt +35 -0
  60. data/lib/tennpipes-init/generators/project/config/boot.rb +49 -0
  61. data/lib/tennpipes-init/generators/project/public/favicon.ico +0 -0
  62. data/lib/tennpipes-init/generators/project/public/images/booking.com.png +0 -0
  63. data/lib/tennpipes-init/generators/project/public/images/causes.png +0 -0
  64. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bg.jpg +0 -0
  65. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bluelogo.png +0 -0
  66. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bluelogo.svg +68 -0
  67. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_whitelogo.png +0 -0
  68. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_whitelogo.svg +65 -0
  69. data/lib/tennpipes-init/generators/project/public/images/forever21.png +0 -0
  70. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.eot +0 -0
  71. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.svg +970 -0
  72. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.ttf +0 -0
  73. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.woff +0 -0
  74. data/lib/tennpipes-init/generators/project/public/images/icons/tennpipes-icons.css +598 -0
  75. data/lib/tennpipes-init/generators/project/public/images/image1.jpg +0 -0
  76. data/lib/tennpipes-init/generators/project/public/images/image11.jpg +0 -0
  77. data/lib/tennpipes-init/generators/project/public/images/image2.jpg +0 -0
  78. data/lib/tennpipes-init/generators/project/public/images/image3.jpg +0 -0
  79. data/lib/tennpipes-init/generators/project/public/images/intuit.png +0 -0
  80. data/lib/tennpipes-init/generators/project/public/images/krispykreme.png +0 -0
  81. data/lib/tennpipes-init/generators/project/public/images/placeholders/README.md +302 -0
  82. data/lib/tennpipes-init/generators/project/public/images/placeholders/bower.json +4 -0
  83. data/lib/tennpipes-init/generators/project/public/images/placeholders/composer.json +34 -0
  84. data/lib/tennpipes-init/generators/project/public/images/placeholders/gulpfile.js +92 -0
  85. data/lib/tennpipes-init/generators/project/public/images/placeholders/holder.js +1920 -0
  86. data/lib/tennpipes-init/generators/project/public/images/placeholders/holder.min.js +12 -0
  87. data/lib/tennpipes-init/generators/project/public/images/placeholders/package.json +46 -0
  88. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/holder.js +1411 -0
  89. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/augment.js +27 -0
  90. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/ondomready.js +155 -0
  91. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/polyfills.js +177 -0
  92. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/scenegraph.js +101 -0
  93. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/utils.js +129 -0
  94. data/lib/tennpipes-init/generators/project/public/images/priceline.com.png +0 -0
  95. data/lib/tennpipes-init/generators/project/public/images/stripe.png +0 -0
  96. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes.min.js +6081 -0
  97. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.abide.js +340 -0
  98. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.accordion.js +67 -0
  99. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.alert.js +43 -0
  100. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.clearing.js +556 -0
  101. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.dropdown.js +448 -0
  102. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.equalizer.js +77 -0
  103. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.interchange.js +354 -0
  104. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.joyride.js +932 -0
  105. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.js +703 -0
  106. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.magellan.js +203 -0
  107. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.offcanvas.js +152 -0
  108. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.orbit.js +476 -0
  109. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.reveal.js +471 -0
  110. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.slider.js +263 -0
  111. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.tab.js +237 -0
  112. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.tooltip.js +307 -0
  113. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.topbar.js +452 -0
  114. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/fastclick.js +8 -0
  115. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/jquery.cookie.js +8 -0
  116. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/jquery.js +26 -0
  117. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/modernizr.js +8 -0
  118. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/placeholder.js +2 -0
  119. data/lib/tennpipes-init/generators/project/public/stylesheets/app.css~ +178 -0
  120. data/lib/tennpipes-init/generators/project/public/stylesheets/app1.css~ +177 -0
  121. data/lib/tennpipes-init/generators/project/public/stylesheets/ennkeypee.css +214 -0
  122. data/lib/tennpipes-init/generators/project/public/stylesheets/ennkeypee.css~ +214 -0
  123. data/lib/tennpipes-init/generators/project/public/stylesheets/normalize.css +427 -0
  124. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.css +6201 -0
  125. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.css~ +6201 -0
  126. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.min.css +1 -0
  127. data/lib/tennpipes-init/generators/runner.rb +139 -0
  128. data/lib/tennpipes-init/generators/task.rb +45 -0
  129. data/lib/tennpipes-init/generators/templates/Gemfile.tt +32 -0
  130. data/lib/tennpipes-init/generators/templates/Rakefile.tt +8 -0
  131. data/lib/tennpipes-init/generators/templates/controller.rb.tt +22 -0
  132. data/lib/tennpipes-init/generators/templates/gem/README.md.tt +29 -0
  133. data/lib/tennpipes-init/generators/templates/gem/gemspec.tt +19 -0
  134. data/lib/tennpipes-init/generators/templates/gem/lib/libname.tt +6 -0
  135. data/lib/tennpipes-init/generators/templates/gem/lib/libname/version.tt +3 -0
  136. data/lib/tennpipes-init/generators/templates/helper.rb.tt +13 -0
  137. data/lib/tennpipes-init/generators/templates/initializer.rb.tt +5 -0
  138. data/lib/tennpipes-init/generators/templates/mailer.rb.tt +54 -0
  139. data/lib/tennpipes-init/generators/templates/project_bin.tt +14 -0
  140. data/lib/tennpipes-init/generators/templates/task.rb.tt +7 -0
  141. data/lib/tennpipes-init/tennpipes-tasks/activerecord.rb +377 -0
  142. data/lib/tennpipes-init/tennpipes-tasks/database.rb +12 -0
  143. data/lib/tennpipes-init/tennpipes-tasks/datamapper.rb +94 -0
  144. data/lib/tennpipes-init/tennpipes-tasks/minirecord.rb +19 -0
  145. data/lib/tennpipes-init/tennpipes-tasks/mongoid.rb +215 -0
  146. data/lib/tennpipes-init/tennpipes-tasks/mongomapper.rb +55 -0
  147. data/lib/tennpipes-init/tennpipes-tasks/sequel.rb +85 -0
  148. data/lib/tennpipes-init/tennpipes-tasks/sql-helpers.rb +72 -0
  149. data/test/fixtures/admin_template.rb +7 -0
  150. data/test/fixtures/example_template.rb +15 -0
  151. data/test/fixtures/git_template.rb +4 -0
  152. data/test/fixtures/plugin_template.rb +13 -0
  153. data/test/fixtures/rake_template.rb +9 -0
  154. data/test/helper.rb +103 -0
  155. data/test/test_app_generator.rb +142 -0
  156. data/test/test_cli.rb +27 -0
  157. data/test/test_component_generator.rb +98 -0
  158. data/test/test_controller_generator.rb +272 -0
  159. data/test/test_generator.rb +13 -0
  160. data/test/test_helper_generator.rb +133 -0
  161. data/test/test_mailer_generator.rb +69 -0
  162. data/test/test_migration_generator.rb +222 -0
  163. data/test/test_model_generator.rb +553 -0
  164. data/test/test_plugin_generator.rb +152 -0
  165. data/test/test_project_generator.rb +757 -0
  166. data/test/test_task_generator.rb +53 -0
  167. metadata +285 -0
@@ -0,0 +1,222 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
+
3
+ describe "MigrationGenerator" do
4
+ def setup
5
+ @apptmp = "#{Dir.tmpdir}/tennpipes-tests/#{SecureRandom.hex}"
6
+ `mkdir -p #{@apptmp}`
7
+ end
8
+
9
+ def teardown
10
+ `rm -rf #{@apptmp}`
11
+ end
12
+
13
+ describe 'the migration generator' do
14
+ it 'should fail outside app root' do
15
+ out, err = capture_io { generate(:migration, 'add_email_to_users', '-r=/tmp') }
16
+ assert_match(/not at the root/, out)
17
+ assert_no_file_exists("#{@apptmp}/db/migrate")
18
+ end
19
+
20
+ it 'should fail if we do not use an adapter' do
21
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon') }
22
+ assert_raises(SystemExit) { capture_io { generate(:migration, 'AddEmailToUsers', "-r=#{@apptmp}/sample_project") } }
23
+ end
24
+
25
+ it 'should generate migration inside app root' do
26
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
27
+ response_success = capture_io { generate(:migration, 'AddEmailToUsers', "-r=#{@apptmp}/sample_project") }
28
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_add_email_to_users.rb"
29
+ assert_match_in_file(/class AddEmailToUser/m, migration_file_path)
30
+ end
31
+
32
+ it 'should generate migration inside app root with lowercase migration argument' do
33
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
34
+ response_success = capture_io { generate(:migration, 'add_email_to_users', "-r=#{@apptmp}/sample_project") }
35
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_add_email_to_users.rb"
36
+ assert_match_in_file(/class AddEmailToUsers/m, migration_file_path)
37
+ end
38
+
39
+ it 'should generate migration inside app root with singular table' do
40
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
41
+ capture_io { generate(:migration, 'add_email_to_user', "email:string", "-r=#{@apptmp}/sample_project") }
42
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_add_email_to_user.rb"
43
+ assert_match_in_file(/class AddEmailToUser/m, migration_file_path)
44
+ assert_match_in_file(/t.string :email/, migration_file_path)
45
+ assert_match_in_file(/t.remove :email/, migration_file_path)
46
+ end
47
+
48
+ describe "the default migration numbering" do
49
+ it 'should properly calculate version number' do
50
+ capture_io { generate(:project, 'sample_project', "--migration_format=number", "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
51
+ capture_io { generate(:migration, 'add_email_to_person', "email:string", "-r=#{@apptmp}/sample_project") }
52
+ capture_io { generate(:migration, 'add_name_to_person', "email:string", "-r=#{@apptmp}/sample_project") }
53
+ capture_io { generate(:migration, 'add_age_to_user', "email:string", "-r=#{@apptmp}/sample_project") }
54
+ assert_match_in_file(/Sequel\.migration do/m, "#{@apptmp}/sample_project/db/migrate/001_add_email_to_person.rb")
55
+ assert_match_in_file(/Sequel\.migration do/m, "#{@apptmp}/sample_project/db/migrate/002_add_name_to_person.rb")
56
+ assert_match_in_file(/Sequel\.migration do/m, "#{@apptmp}/sample_project/db/migrate/003_add_age_to_user.rb")
57
+ end
58
+ end
59
+
60
+ describe "the timestamped migration numbering" do
61
+ it 'should properly calculate version number' do
62
+ capture_io { generate(:project, 'sample_project', "--migration_format=timestamp", "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
63
+
64
+ time = stop_time_for_test.utc.strftime("%Y%m%d%H%M%S")
65
+
66
+ capture_io { generate(:migration, 'add_gender_to_person', "gender:string", "-r=#{@apptmp}/sample_project") }
67
+ assert_match_in_file(/Sequel\.migration do/m, "#{@apptmp}/sample_project/db/migrate/#{time}_add_gender_to_person.rb")
68
+ end
69
+ end
70
+
71
+ describe 'the migration argument' do
72
+ it 'should properly extract a table name from argument' do
73
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
74
+ capture_io { generate(:migration, 'AddAuthenticityTokenFieldsToUsers', 'authentity_token:string', "-r=#{@apptmp}/sample_project") }
75
+ capture_io { generate(:migration, 'AddEmailToTokyo', 'email:string', "-r=#{@apptmp}/sample_project") }
76
+ capture_io { generate(:migration, 'AddLocationTofoo', 'location:string', "-r=#{@apptmp}/sample_project") }
77
+ migration_file_path1 = "#{@apptmp}/sample_project/db/migrate/001_add_authenticity_token_fields_to_users.rb"
78
+ migration_file_path2 = "#{@apptmp}/sample_project/db/migrate/002_add_email_to_tokyo.rb"
79
+ migration_file_path3 = "#{@apptmp}/sample_project/db/migrate/003_add_location_tofoo.rb"
80
+ assert_match_in_file(/change_table :users/, migration_file_path1)
81
+ assert_match_in_file(/change_table :tokyo/, migration_file_path2)
82
+ assert_match_in_file(/change_table :foos/, migration_file_path3)
83
+ end
84
+ end
85
+ end
86
+
87
+ describe 'the migration generator for activerecord' do
88
+ it 'should generate migration for generic needs' do
89
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
90
+ response_success = capture_io { generate(:migration, 'ModifyUserFields', "-r=#{@apptmp}/sample_project") }
91
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_modify_user_fields.rb"
92
+ assert_match_in_file(/class ModifyUserFields/m, migration_file_path)
93
+ assert_match_in_file(/def self\.up\s+end/m, migration_file_path)
94
+ assert_match_in_file(/def self\.down\s+end/m, migration_file_path)
95
+ end
96
+
97
+ it 'should generate migration for adding columns' do
98
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
99
+ migration_params = ['AddEmailToUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
100
+ response_success = capture_io { generate(:migration, *migration_params) }
101
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_add_email_to_users.rb"
102
+ assert_match_in_file(/class AddEmailToUsers/m, migration_file_path)
103
+ assert_match_in_file(/change_table :users.*?t\.string :email/m, migration_file_path)
104
+ assert_match_in_file(/t\.integer :age/m, migration_file_path)
105
+ assert_match_in_file(/change_table :users.*?t\.remove :email/m, migration_file_path)
106
+ assert_match_in_file(/t\.remove :age/m, migration_file_path)
107
+ end
108
+
109
+ it 'should generate migration for removing columns' do
110
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
111
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
112
+ response_success = capture_io { generate(:migration, *migration_params) }
113
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_remove_email_from_users.rb"
114
+ assert_match_in_file(/class RemoveEmailFromUsers/m, migration_file_path)
115
+ assert_match_in_file(/change_table :users.*?t\.remove :email/m, migration_file_path)
116
+ assert_match_in_file(/t\.remove :age/m, migration_file_path)
117
+ assert_match_in_file(/change_table :users.*?t\.string :email/m, migration_file_path)
118
+ assert_match_in_file(/t\.integer :age/m, migration_file_path)
119
+ end
120
+ end
121
+
122
+ describe 'the migration generator for datamapper' do
123
+ it 'should generate migration for generic needs' do
124
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=datamapper') }
125
+ response_success = capture_io { generate(:migration, 'ModifyUserFields', "-r=#{@apptmp}/sample_project") }
126
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_modify_user_fields.rb"
127
+ assert_match_in_file(/migration\s1.*?:modify_user_fields/m, migration_file_path)
128
+ assert_match_in_file(/up\sdo\s+end/m, migration_file_path)
129
+ assert_match_in_file(/down\sdo\s+end/m, migration_file_path)
130
+ end
131
+
132
+ it 'should generate migration for adding columns' do
133
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=datamapper') }
134
+ migration_params = ['AddEmailToUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
135
+ response_success = capture_io { generate(:migration, *migration_params) }
136
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_add_email_to_users.rb"
137
+ assert_match_in_file(/migration\s1.*?:add_email_to_users/m, migration_file_path)
138
+ assert_match_in_file(/modify_table :users.*?add_column :email, String/m, migration_file_path)
139
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
140
+ assert_match_in_file(/modify_table :users.*?drop_column :email/m, migration_file_path)
141
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
142
+ end
143
+
144
+ it 'should generate migration for removing columns' do
145
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=datamapper') }
146
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
147
+ response_success = capture_io { generate(:migration, *migration_params) }
148
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_remove_email_from_users.rb"
149
+ assert_match_in_file(/migration\s1.*?:remove_email_from_users/m, migration_file_path)
150
+ assert_match_in_file(/modify_table :users.*?drop_column :email/m, migration_file_path)
151
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
152
+ assert_match_in_file(/modify_table :users.*?add_column :email, String/m, migration_file_path)
153
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
154
+ end
155
+
156
+ it 'should properly version migration files' do
157
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=datamapper') }
158
+ response_success = capture_io { generate(:migration, 'ModifyUserFields', "-r=#{@apptmp}/sample_project") }
159
+ response_success = capture_io { generate(:migration, 'ModifyUserFields2', "-r=#{@apptmp}/sample_project") }
160
+ response_success = capture_io { generate(:migration, 'ModifyUserFields3', "-r=#{@apptmp}/sample_project") }
161
+ assert_match_in_file(/migration\s1.*?:modify_user_fields/m, "#{@apptmp}/sample_project/db/migrate/001_modify_user_fields.rb")
162
+ assert_match_in_file(/migration\s2.*?:modify_user_fields2/m, "#{@apptmp}/sample_project/db/migrate/002_modify_user_fields2.rb")
163
+ assert_match_in_file(/migration\s3.*?:modify_user_fields3/m, "#{@apptmp}/sample_project/db/migrate/003_modify_user_fields3.rb")
164
+ end
165
+ end
166
+
167
+ describe 'the migration generator for sequel' do
168
+ it 'should generate migration for generic needs' do
169
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
170
+ response_success = capture_io { generate(:migration, 'ModifyUserFields', "-r=#{@apptmp}/sample_project") }
171
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_modify_user_fields.rb"
172
+ assert_match_in_file(/Sequel\.migration/m, migration_file_path)
173
+ assert_match_in_file(/up do\s+end/m, migration_file_path)
174
+ assert_match_in_file(/down do\s+end/m, migration_file_path)
175
+ end
176
+
177
+ it 'should generate migration for adding columns' do
178
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
179
+ migration_params = ['AddEmailToUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
180
+ response_success = capture_io { generate(:migration, *migration_params) }
181
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_add_email_to_users.rb"
182
+ assert_match_in_file(/Sequel\.migration/m, migration_file_path)
183
+ assert_match_in_file(/alter_table :users.*?add_column :email, String/m, migration_file_path)
184
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
185
+ assert_match_in_file(/alter_table :users.*?drop_column :email/m, migration_file_path)
186
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
187
+ end
188
+
189
+ it 'should generate migration for removing columns' do
190
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
191
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
192
+ response_success = capture_io { generate(:migration, *migration_params) }
193
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_remove_email_from_users.rb"
194
+ assert_match_in_file(/Sequel\.migration/m, migration_file_path)
195
+ assert_match_in_file(/alter_table :users.*?drop_column :email/m, migration_file_path)
196
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
197
+ assert_match_in_file(/alter_table :users.*?add_column :email, String/m, migration_file_path)
198
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
199
+ end
200
+ end
201
+
202
+ describe "the migration destroy option" do
203
+
204
+ it 'should destroy the migration files' do
205
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
206
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
207
+ capture_io { generate(:migration, *migration_params) }
208
+ capture_io { generate(:migration, 'RemoveEmailFromUsers', "-r=#{@apptmp}/sample_project",'-d') }
209
+ assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/001_remove_email_from_users.rb")
210
+ end
211
+
212
+ it 'should destroy the migration file regardless of number' do
213
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
214
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
215
+ migration_param2 = ['AddEmailFromUsers', "email:string", "age:integer", "-r=#{@apptmp}/sample_project"]
216
+ capture_io { generate(:migration, *migration_param2) }
217
+ capture_io { generate(:migration, *migration_params) }
218
+ capture_io { generate(:migration, 'RemoveEmailFromUsers', "-r=#{@apptmp}/sample_project",'-d') }
219
+ assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/002_remove_email_from_users.rb")
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,553 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
+
3
+ describe "ModelGenerator" do
4
+ def setup
5
+ @apptmp = "#{Dir.tmpdir}/tennpipes-tests/#{SecureRandom.hex}"
6
+ `mkdir -p #{@apptmp}`
7
+ end
8
+
9
+ def teardown
10
+ `rm -rf #{@apptmp}`
11
+ end
12
+
13
+ describe 'the model generator' do
14
+ it 'should fail outside app root' do
15
+ out, err = capture_io { generate(:model, 'user', "-r=#{@apptmp}") }
16
+ assert_match(/not at the root/, out)
17
+ assert_no_file_exists('/tmp/models/user.rb')
18
+ end
19
+
20
+ it 'should generate filename properly' do
21
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=couchrest') }
22
+ capture_io { generate(:model, 'DemoItem', "name:string", "age", "email:string", "-r=#{@apptmp}/sample_project") }
23
+ assert_file_exists("#{@apptmp}/sample_project/models/demo_item.rb")
24
+ end
25
+
26
+ it 'should fail if field name is not acceptable' do
27
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=couchrest') }
28
+ out, err = capture_io { generate(:model, 'DemoItem', "re@l$ly:string","display-name:string", "age&year:datetime", "email_two:string", "-r=#{@apptmp}/sample_project") }
29
+ assert_match(/Invalid field name:/, out)
30
+ assert_match(/display-name:string/, out)
31
+ assert_match(/age&year:datetime/, out)
32
+ assert_match(/re@l\$ly:string/, out)
33
+ refute_match(/email_two:string/, out)
34
+ refute_match(/apply/, out)
35
+ assert_no_file_exists("#{@apptmp}/sample_project/models/demo_item.rb")
36
+ end
37
+
38
+ it 'should fail if we do not use an adapter' do
39
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon') }
40
+ assert_raises(SystemExit) { capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") } }
41
+ end
42
+
43
+ it 'should not fail if we do not have test component' do
44
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--test=none', '-d=activerecord') }
45
+ response_success = capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") }
46
+ assert_match_in_file(/class User < ActiveRecord::Base/m, "#{@apptmp}/sample_project/models/user.rb")
47
+ assert_no_file_exists("#{@apptmp}/sample_project/test")
48
+ end
49
+
50
+ it 'should generate model in specified app' do
51
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '-d=datamapper', '--script=none', '-t=bacon') }
52
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
53
+ capture_io { generate(:model, 'Post', "body:string", '-a=/subby', "-r=#{@apptmp}/sample_project") }
54
+ assert_match_in_file(/class Post\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/subby/models/post.rb")
55
+ assert_match_in_file(/property :body, String/m, "#{@apptmp}/sample_project/subby/models/post.rb")
56
+ assert_match_in_file(/migration 1, :create_posts do/m, "#{@apptmp}/sample_project/db/migrate/001_create_posts.rb")
57
+ assert_match_in_file(/DataMapper.finalize/m,"#{@apptmp}/sample_project/config/boot.rb")
58
+ end
59
+
60
+ it 'should generate migration file versions properly' do
61
+ capture_io { generate(:project, 'sample_project', "--migration_format=number", "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
62
+ capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") }
63
+ capture_io { generate(:model, 'account', "-r=#{@apptmp}/sample_project") }
64
+ capture_io { generate(:model, 'bank', "-r=#{@apptmp}/sample_project") }
65
+ assert_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_users.rb")
66
+ assert_file_exists("#{@apptmp}/sample_project/db/migrate/002_create_accounts.rb")
67
+ assert_file_exists("#{@apptmp}/sample_project/db/migrate/003_create_banks.rb")
68
+ end
69
+
70
+ it 'should generate migration file versions properly when timestamped' do
71
+ capture_io { generate(:project, 'sample_project', "--migration_format=timestamp", "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
72
+
73
+ time = stop_time_for_test.utc.strftime("%Y%m%d%H%M%S")
74
+
75
+ capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") }
76
+ assert_file_exists("#{@apptmp}/sample_project/db/migrate/#{time}_create_users.rb")
77
+ end
78
+
79
+ it 'should generate a default type value for fields' do
80
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
81
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
82
+ capture_io { generate(:model, 'person', "name", "age:integer", "email", "-r=#{@apptmp}/sample_project") }
83
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_create_people.rb"
84
+ assert_match_in_file(/class CreatePeople < ActiveRecord::Migration/m, migration_file_path)
85
+ assert_match_in_file(/ create_table :people/m, migration_file_path)
86
+ assert_match_in_file(/ t.string :name/m, migration_file_path)
87
+ assert_match_in_file(/ t.integer :age/m, migration_file_path)
88
+ assert_match_in_file(/ t.string :email/m, migration_file_path)
89
+ assert_match_in_file(/ drop_table :people/m, migration_file_path)
90
+ end
91
+
92
+ it 'should abort if model name already exists' do
93
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", "-d=activerecord") }
94
+ out, err = capture_io { generate(:model, 'kernel', "--root=#{@apptmp}/sample_project") }
95
+ assert_match(/Kernel already exists/, out)
96
+ assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_kernel.rb")
97
+ assert_no_file_exists("#{@apptmp}/sample_project/models/kernel.rb")
98
+ end
99
+
100
+ it 'should abort if model name already exists in root' do
101
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", "-d=activerecord") }
102
+ capture_io { generate(:app, 'user', "--root=#{@apptmp}/sample_project") }
103
+ out, err = capture_io { generate_with_parts(:model, 'user', "--root=#{@apptmp}/sample_project", :apps => "user") }
104
+ assert_file_exists("#{@apptmp}/sample_project/user/app.rb")
105
+ assert_no_file_exists("#{@apptmp}/sample_project/models/user.rb")
106
+ assert_match(/User already exists/, out)
107
+ end
108
+
109
+ it 'should generate model files if :force option is specified' do
110
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", "-d=activerecord") }
111
+ capture_io { generate(:app, 'user', "--root=#{@apptmp}/sample_project") }
112
+ out, err = capture_io { generate_with_parts(:model, 'user', "--root=#{@apptmp}/sample_project", "--force", :apps => "user") }
113
+ assert_file_exists("#{@apptmp}/sample_project/user/app.rb")
114
+ assert_file_exists("#{@apptmp}/sample_project/models/user.rb")
115
+ end
116
+ end
117
+
118
+ # ACTIVERECORD
119
+ describe "model generator using activerecord" do
120
+ it 'should add activerecord middleware' do
121
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=activerecord') }
122
+ assert_match_in_file(/ use ConnectionPoolManagement/m, "#{@apptmp}/sample_project/app/app.rb")
123
+ assert_file_exists("#{@apptmp}/sample_project/lib/connection_pool_management_middleware.rb")
124
+ end
125
+
126
+ it 'should generate model file' do
127
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
128
+ capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") }
129
+ assert_match_in_file(/class User < ActiveRecord::Base/m, "#{@apptmp}/sample_project/models/user.rb")
130
+ end
131
+
132
+ it 'should generate model file with camelized name' do
133
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
134
+ capture_io { generate(:model, 'ChunkyBacon', "-r=#{@apptmp}/sample_project") }
135
+ assert_match_in_file(/class ChunkyBacon < ActiveRecord::Base/m, "#{@apptmp}/sample_project/models/chunky_bacon.rb")
136
+ assert_match_in_file(/ChunkyBacon Model/, "#{@apptmp}/sample_project/test/models/chunky_bacon_test.rb")
137
+ end
138
+
139
+ it 'should generate migration file with no fields' do
140
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
141
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
142
+ capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") }
143
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_create_users.rb"
144
+ assert_match_in_file(/class CreateUsers < ActiveRecord::Migration/m, migration_file_path)
145
+ assert_match_in_file(/ create_table :users/m, migration_file_path)
146
+ assert_match_in_file(/ drop_table :users/m, migration_file_path)
147
+ end
148
+
149
+ it 'should generate migration file with given fields' do
150
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
151
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
152
+ capture_io { generate(:model, 'person', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
153
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_create_people.rb"
154
+ assert_match_in_file(/class CreatePeople < ActiveRecord::Migration/m, migration_file_path)
155
+ assert_match_in_file(/ create_table :people/m, migration_file_path)
156
+ assert_match_in_file(/ t.string :name/m, migration_file_path)
157
+ assert_match_in_file(/ t.integer :age/m, migration_file_path)
158
+ assert_match_in_file(/ t.string :email/m, migration_file_path)
159
+ assert_match_in_file(/ drop_table :people/m, migration_file_path)
160
+ end
161
+ end
162
+
163
+ # MINIRECORD
164
+ describe "model generator using minirecord" do
165
+ it 'should generate hooks for auto upgrade' do
166
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=minirecord') }
167
+ assert_match_in_file(
168
+ "Tennpipes.after_load do\n ActiveRecord::Base.auto_upgrade!",
169
+ "#{@apptmp}/sample_project/config/boot.rb"
170
+ )
171
+ end
172
+
173
+ it 'should add activerecord middleware' do
174
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=minirecord') }
175
+ assert_match_in_file(/ use ConnectionPoolManagement/m, "#{@apptmp}/sample_project/app/app.rb")
176
+ assert_file_exists("#{@apptmp}/sample_project/lib/connection_pool_management_middleware.rb")
177
+ end
178
+
179
+ it 'should generate model file' do
180
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=minirecord') }
181
+ capture_io { generate(:model, 'user', 'name:string', 'surname:string', 'age:integer', "-r=#{@apptmp}/sample_project") }
182
+ assert_match_in_file(/class User < ActiveRecord::Base/m, "#{@apptmp}/sample_project/models/user.rb")
183
+ assert_match_in_file(/field :name, :as => :string/m, "#{@apptmp}/sample_project/models/user.rb")
184
+ assert_match_in_file(/field :surname, :as => :string/m, "#{@apptmp}/sample_project/models/user.rb")
185
+ assert_match_in_file(/field :age, :as => :integer/m, "#{@apptmp}/sample_project/models/user.rb")
186
+ end
187
+
188
+ it 'should generate model file with camelized name' do
189
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=minirecord') }
190
+ capture_io { generate(:model, 'ChunkyBacon', "-r=#{@apptmp}/sample_project") }
191
+ assert_match_in_file(/class ChunkyBacon < ActiveRecord::Base/m, "#{@apptmp}/sample_project/models/chunky_bacon.rb")
192
+ assert_match_in_file(/ChunkyBacon Model/, "#{@apptmp}/sample_project/test/models/chunky_bacon_test.rb")
193
+ end
194
+ end
195
+
196
+ # COUCHREST
197
+ describe "model generator using couchrest" do
198
+ it 'should generate model file with no properties' do
199
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=couchrest') }
200
+ capture_io { generate(:model, 'user', "-r=#{@apptmp}/sample_project") }
201
+ assert_match_in_file(/class User < CouchRest::Model::Base/m, "#{@apptmp}/sample_project/models/user.rb")
202
+ assert_match_in_file(/# property <name>[\s\n]+?end/m, "#{@apptmp}/sample_project/models/user.rb")
203
+ end
204
+
205
+ it 'should generate model file with given fields' do
206
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=couchrest') }
207
+ capture_io { generate(:model, 'person', "name:string", "age", "email:string", "-r=#{@apptmp}/sample_project") }
208
+ assert_match_in_file(/class Person < CouchRest::Model::Base/m, "#{@apptmp}/sample_project/models/person.rb")
209
+ assert_match_in_file(/property :name/m, "#{@apptmp}/sample_project/models/person.rb")
210
+ assert_match_in_file(/property :age/m, "#{@apptmp}/sample_project/models/person.rb")
211
+ assert_match_in_file(/property :email/m, "#{@apptmp}/sample_project/models/person.rb")
212
+ end
213
+ end
214
+
215
+ # DATAMAPPER
216
+ describe "model generator using datamapper" do
217
+ it 'should generate model file with camelized name' do
218
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=datamapper') }
219
+ capture_io { generate(:model, 'ChunkyBacon', "-r=#{@apptmp}/sample_project") }
220
+ assert_match_in_file(/class ChunkyBacon\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/models/chunky_bacon.rb")
221
+ assert_match_in_file(/ChunkyBacon Model/, "#{@apptmp}/sample_project/test/models/chunky_bacon_test.rb")
222
+ end
223
+
224
+ it 'should generate model file with fields' do
225
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=datamapper') }
226
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "created_at:datetime", "-r=#{@apptmp}/sample_project") }
227
+ assert_match_in_file(/class User\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/models/user.rb")
228
+ assert_match_in_file(/property :name, String/m, "#{@apptmp}/sample_project/models/user.rb")
229
+ assert_match_in_file(/property :age, Integer/m, "#{@apptmp}/sample_project/models/user.rb")
230
+ assert_match_in_file(/property :created_at, DateTime/m, "#{@apptmp}/sample_project/models/user.rb")
231
+ end
232
+
233
+ it 'should properly generate version numbers' do
234
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=datamapper') }
235
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "created_at:datetime", "-r=#{@apptmp}/sample_project") }
236
+ capture_io { generate(:model, 'person', "name:string", "age:integer", "created_at:datetime", "-r=#{@apptmp}/sample_project") }
237
+ capture_io { generate(:model, 'account', "name:string", "age:integer", "created_at:datetime", "-r=#{@apptmp}/sample_project") }
238
+ assert_match_in_file(/class User\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/models/user.rb")
239
+ assert_match_in_file(/migration 1, :create_users do/m, "#{@apptmp}/sample_project/db/migrate/001_create_users.rb")
240
+ assert_match_in_file(/class Person\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/models/person.rb")
241
+ assert_match_in_file(/migration 2, :create_people do/m, "#{@apptmp}/sample_project/db/migrate/002_create_people.rb")
242
+ assert_match_in_file(/class Account\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/models/account.rb")
243
+ assert_match_in_file(/migration 3, :create_accounts do/m, "#{@apptmp}/sample_project/db/migrate/003_create_accounts.rb")
244
+ end
245
+
246
+ it 'should generate migration with given fields' do
247
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
248
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=datamapper') }
249
+ capture_io { generate(:model, 'person', "name:string", "created_at:date_time", "email:string", "-r=#{@apptmp}/sample_project") }
250
+ assert_match_in_file(/class Person\n\s+include DataMapper::Resource/m, "#{@apptmp}/sample_project/models/person.rb")
251
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_create_people.rb"
252
+ assert_match_in_file(/migration 1, :create_people do/m, migration_file_path)
253
+ assert_match_in_file(/create_table :people do/m, migration_file_path)
254
+ assert_match_in_file(/column :name, DataMapper::Property::String/m, migration_file_path)
255
+ assert_match_in_file(/column :created_at, DataMapper::Property::DateTime/m, migration_file_path)
256
+ assert_match_in_file(/column :email, DataMapper::Property::String/m, migration_file_path)
257
+ assert_match_in_file(/drop_table :people/m, migration_file_path)
258
+ end
259
+ end
260
+
261
+ # SEQUEL
262
+ describe "model generator using sequel" do
263
+ it 'should generate model file with given properties' do
264
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=sequel') }
265
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "created:datetime", "-r=#{@apptmp}/sample_project") }
266
+ assert_match_in_file(/class User < Sequel::Model/m, "#{@apptmp}/sample_project/models/user.rb")
267
+ end
268
+
269
+ it 'should generate model file with camelized name' do
270
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=sequel') }
271
+ capture_io { generate(:model, 'ChunkyBacon', "-r=#{@apptmp}/sample_project") }
272
+ assert_match_in_file(/class ChunkyBacon < Sequel::Model/m, "#{@apptmp}/sample_project/models/chunky_bacon.rb")
273
+ assert_match_in_file(/ChunkyBacon Model/, "#{@apptmp}/sample_project/test/models/chunky_bacon_test.rb")
274
+ end
275
+
276
+ it 'should generate migration file with given properties' do
277
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
278
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=sequel') }
279
+ capture_io { generate(:model, 'person', "name:string", "age:integer", "created:datetime", "-r=#{@apptmp}/sample_project") }
280
+ migration_file_path = "#{@apptmp}/sample_project/db/migrate/001_create_people.rb"
281
+ assert_match_in_file(/class Person < Sequel::Model/m, "#{@apptmp}/sample_project/models/person.rb")
282
+ assert_match_in_file(/Sequel\.migration do/m, migration_file_path)
283
+ assert_match_in_file(/create_table :people/m, migration_file_path)
284
+ assert_match_in_file(/String :name/m, migration_file_path)
285
+ assert_match_in_file(/Integer :age/m, migration_file_path)
286
+ assert_match_in_file(/DateTime :created/m, migration_file_path)
287
+ assert_match_in_file(/drop_table :people/m, migration_file_path)
288
+ end
289
+ end
290
+
291
+ # MONGODB
292
+ describe "model generator using mongomapper" do
293
+ it 'should generate model file with no properties' do
294
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=mongomapper') }
295
+ capture_io { generate(:model, 'person', "-r=#{@apptmp}/sample_project") }
296
+ assert_match_in_file(/class Person\n\s+include MongoMapper::Document/m, "#{@apptmp}/sample_project/models/person.rb")
297
+ assert_match_in_file(/# key <name>, <type>/m, "#{@apptmp}/sample_project/models/person.rb")
298
+ assert_match_in_file(/timestamps![\n\s]+end/m, "#{@apptmp}/sample_project/models/person.rb")
299
+ end
300
+
301
+ it 'should generate model file with given fields' do
302
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=mongomapper') }
303
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
304
+ assert_match_in_file(/class User\n\s+include MongoMapper::Document/m, "#{@apptmp}/sample_project/models/user.rb")
305
+ assert_match_in_file(/key :name, String/m, "#{@apptmp}/sample_project/models/user.rb")
306
+ assert_match_in_file(/key :age, Integer/m, "#{@apptmp}/sample_project/models/user.rb")
307
+ assert_match_in_file(/key :email, String/m, "#{@apptmp}/sample_project/models/user.rb")
308
+ assert_match_in_file(/timestamps!/m, "#{@apptmp}/sample_project/models/user.rb")
309
+ end
310
+ end
311
+
312
+ describe "model generator using mongoid" do
313
+ it 'should generate model file with no properties' do
314
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=mongoid') }
315
+ capture_io { generate(:model, 'person', "-r=#{@apptmp}/sample_project") }
316
+ assert_match_in_file(/class Person\n\s+include Mongoid::Document/m, "#{@apptmp}/sample_project/models/person.rb")
317
+ assert_match_in_file(/# field <name>, :type => <type>, :default => <value>/m, "#{@apptmp}/sample_project/models/person.rb")
318
+ end
319
+
320
+ it 'should generate model file with given fields' do
321
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=mongoid') }
322
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
323
+ assert_match_in_file(/class User\n\s+include Mongoid::Document/m, "#{@apptmp}/sample_project/models/user.rb")
324
+ assert_match_in_file(/field :name, :type => String/m, "#{@apptmp}/sample_project/models/user.rb")
325
+ assert_match_in_file(/field :age, :type => Integer/m, "#{@apptmp}/sample_project/models/user.rb")
326
+ assert_match_in_file(/field :email, :type => String/m, "#{@apptmp}/sample_project/models/user.rb")
327
+ end
328
+ end
329
+
330
+ # REDIS
331
+ describe "model generator using ohm" do
332
+ it 'should generate model file with no properties' do
333
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=ohm') }
334
+ capture_io { generate(:model, 'person', "-r=#{@apptmp}/sample_project") }
335
+ assert_match_in_file(/class Person < Ohm::Model/, "#{@apptmp}/sample_project/models/person.rb")
336
+ assert_match_in_file(/# attribute :name/m, "#{@apptmp}/sample_project/models/person.rb")
337
+ assert_match_in_file(/# reference :venue, Venue/m, "#{@apptmp}/sample_project/models/person.rb")
338
+ end
339
+
340
+ it 'should generate model file with given fields' do
341
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=ohm') }
342
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
343
+ assert_match_in_file(/class User < Ohm::Model/, "#{@apptmp}/sample_project/models/user.rb")
344
+ assert_match_in_file(/attribute :name/m, "#{@apptmp}/sample_project/models/user.rb")
345
+ assert_match_in_file(/attribute :age/m, "#{@apptmp}/sample_project/models/user.rb")
346
+ assert_match_in_file(/attribute :email/m, "#{@apptmp}/sample_project/models/user.rb")
347
+ end
348
+ end
349
+
350
+ # MONGOMATIC
351
+ describe "model generator using mongomatic" do
352
+ it 'should generate model file with no properties' do
353
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=mongomatic') }
354
+ capture_io { generate(:model, 'person', "-r=#{@apptmp}/sample_project") }
355
+ assert_match_in_file(/class Person < Mongomatic::Base/, "#{@apptmp}/sample_project/models/person.rb")
356
+ assert_match_in_file(/include Mongomatic::Expectations::Helper/m, "#{@apptmp}/sample_project/models/person.rb")
357
+ end
358
+
359
+ it 'should generate model file with given fields' do
360
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=mongomatic') }
361
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
362
+ assert_match_in_file(/class User < Mongomatic::Base/, "#{@apptmp}/sample_project/models/user.rb")
363
+ assert_match_in_file(/include Mongomatic::Expectations::Helper/, "#{@apptmp}/sample_project/models/user.rb")
364
+ assert_match_in_file(/be_present self\['name'\]/m, "#{@apptmp}/sample_project/models/user.rb")
365
+ assert_match_in_file(/be_present self\['age'\]/m, "#{@apptmp}/sample_project/models/user.rb")
366
+ assert_match_in_file(/be_present self\['email'\]/m, "#{@apptmp}/sample_project/models/user.rb")
367
+ assert_match_in_file(/be_a_number self\['age'\]/m, "#{@apptmp}/sample_project/models/user.rb")
368
+ end
369
+ end
370
+
371
+ # RIPPLE
372
+ describe "model generator using ripple" do
373
+ it 'should generate model file with no properties' do
374
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=ripple') }
375
+ capture_io { generate(:model, 'person', "name:string", "-r=#{@apptmp}/sample_project") }
376
+ assert_match_in_file(/class Person\n\s+include Ripple::Document/m, "#{@apptmp}/sample_project/models/person.rb")
377
+ assert_match_in_file(/# property :name, String/m, "#{@apptmp}/sample_project/models/person.rb")
378
+ assert_match_in_file(/# many :addresses/m, "#{@apptmp}/sample_project/models/person.rb")
379
+ assert_match_in_file(/# one :account/m, "#{@apptmp}/sample_project/models/person.rb")
380
+ end
381
+
382
+ it 'should generate model file with given fields' do
383
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=ripple') }
384
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
385
+ assert_match_in_file(/class User\n\s+include Ripple::Document/m, "#{@apptmp}/sample_project/models/user.rb")
386
+ assert_match_in_file(/property :name, String/m, "#{@apptmp}/sample_project/models/user.rb")
387
+ assert_match_in_file(/property :age, Integer/m, "#{@apptmp}/sample_project/models/user.rb")
388
+ assert_match_in_file(/property :email, String/m, "#{@apptmp}/sample_project/models/user.rb")
389
+ end
390
+ end
391
+
392
+ # DYNAMOID
393
+ describe "model generator using dynamoid" do
394
+ it 'should generate model file with no properties' do
395
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=dynamoid') }
396
+ capture_io { generate(:model, 'person', "name:string", "-r=#{@apptmp}/sample_project") }
397
+ assert_match_in_file(/class Person\n\s+include Dynamoid::Document/m, "#{@apptmp}/sample_project/models/person.rb")
398
+ end
399
+
400
+ it 'should generate model file with given fields' do
401
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-d=dynamoid') }
402
+ capture_io { generate(:model, 'user', "name:string", "age:integer", "email:string", "-r=#{@apptmp}/sample_project") }
403
+ assert_match_in_file(/class User\n\s+include Dynamoid::Document/m, "#{@apptmp}/sample_project/models/user.rb")
404
+ assert_match_in_file(/field :name, :string/m, "#{@apptmp}/sample_project/models/user.rb")
405
+ assert_match_in_file(/field :age, :integer/m, "#{@apptmp}/sample_project/models/user.rb")
406
+ assert_match_in_file(/field :email, :string/m, "#{@apptmp}/sample_project/models/user.rb")
407
+ end
408
+ end
409
+
410
+ describe "model generator testing files" do
411
+ # BACON
412
+ it 'should generate test file for bacon' do
413
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
414
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
415
+ capture_io { generate(:model, 'SomeUser', "-r=#{@apptmp}/sample_project") }
416
+ assert_match_in_file(/describe "SomeUser Model"/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
417
+ assert_match_in_file(/@some_user = SomeUser.new/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
418
+ assert_match_in_file(/@some_user\.should\.not\.be\.nil/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
419
+ assert_match_in_file(/'(\/\.\.){1}\/test/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
420
+ end
421
+
422
+ it 'should generate test file for bacon in specified app' do
423
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
424
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
425
+ capture_io { generate(:model, 'SomeUser', "-a=/subby", "-r=#{@apptmp}/sample_project") }
426
+ assert_match_in_file(/describe "SomeUser Model"/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
427
+ assert_match_in_file(/@some_user = SomeUser.new/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
428
+ assert_match_in_file(/@some_user\.should\.not\.be\.nil/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
429
+ assert_match_in_file(/'(\/\.\.){2}\/test/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
430
+ end
431
+
432
+ # RIOT
433
+ it 'should generate test file for riot' do
434
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=riot', '-d=activerecord') }
435
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
436
+ capture_io { generate(:model, 'SomeUser', "-r=#{@apptmp}/sample_project") }
437
+ assert_match_in_file(/context "SomeUser Model" do/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
438
+ assert_match_in_file(/SomeUser.new/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
439
+ assert_match_in_file(/asserts\("that record is not nil"\) \{ \!topic.nil\? \}/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
440
+ assert_match_in_file(/'(\/\.\.){1}\/test/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
441
+ end
442
+
443
+ it 'should generate test file for riot in specified app' do
444
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=riot', '-d=activerecord') }
445
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
446
+ capture_io { generate(:model, 'SomeUser', "-a=/subby", "-r=#{@apptmp}/sample_project") }
447
+ assert_match_in_file(/context "SomeUser Model" do/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
448
+ assert_match_in_file(/SomeUser.new/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
449
+ assert_match_in_file(/asserts\("that record is not nil"\) \{ \!topic.nil\? \}/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
450
+ assert_match_in_file(/'(\/\.\.){2}\/test/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
451
+ end
452
+
453
+ # MINITEST
454
+ it 'should generate test file for minitest' do
455
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=minitest', '-d=activerecord') }
456
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
457
+ capture_io { generate(:model, 'SomeUser', "-r=#{@apptmp}/sample_project") }
458
+ assert_match_in_file(/describe "SomeUser Model"/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
459
+ assert_match_in_file(/refute_nil @some_user/m, "#{@apptmp}/sample_project/test/models/some_user_test.rb")
460
+ end
461
+
462
+ it 'should generate test file for minitest in specified app' do
463
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=minitest', '-d=activerecord') }
464
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
465
+ capture_io { generate(:model, 'SomeUser', "-a=/subby", "-r=#{@apptmp}/sample_project") }
466
+ assert_match_in_file(/describe "SomeUser Model"/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
467
+ assert_match_in_file(/refute_nil @some_user/m, "#{@apptmp}/sample_project/test/subby/models/some_user_test.rb")
468
+ end
469
+
470
+ # RSPEC
471
+ it 'should generate test file for rspec' do
472
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=rspec', '-d=activerecord') }
473
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
474
+ capture_io { generate(:model, 'SomeUser', "-r=#{@apptmp}/sample_project") }
475
+ assert_match_in_file(/describe SomeUser do/m, "#{@apptmp}/sample_project/spec/models/some_user_spec.rb")
476
+ # assert_match_in_file(/let\(:some_user\) \{ SomeUser.new \}/m, "#{@apptmp}/sample_project/spec/models/some_user_spec.rb")
477
+ # assert_match_in_file(/some_user\.should_not be_nil/m, "#{@apptmp}/sample_project/spec/models/some_user_spec.rb")
478
+ end
479
+
480
+ it 'should generate test file for rspec in specified app' do
481
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=rspec', '-d=activerecord') }
482
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
483
+ capture_io { generate(:model, 'SomeUser', "-a=/subby", "-r=#{@apptmp}/sample_project") }
484
+ assert_match_in_file(/describe SomeUser do/m, "#{@apptmp}/sample_project/spec/subby/models/some_user_spec.rb")
485
+ # assert_match_in_file(/let\(:some_user\) \{ SomeUser.new \}/m, "#{@apptmp}/sample_project/spec/subby/models/some_user_spec.rb")
486
+ # assert_match_in_file(/some_user\.should_not be_nil/m, "#{@apptmp}/sample_project/spec/subby/models/some_user_spec.rb")
487
+ end
488
+
489
+ # SHOULDA
490
+ it 'should generate test file for shoulda' do
491
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=shoulda', '-d=activerecord') }
492
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
493
+ capture_io { generate(:model, 'SomePerson', "-r=#{@apptmp}/sample_project") }
494
+ assert_match_in_file(/class SomePersonTest < Test::Unit::TestCase/m, "#{@apptmp}/sample_project/test/models/some_person_test.rb")
495
+ assert_match_in_file(/context "SomePerson Model"/m, "#{@apptmp}/sample_project/test/models/some_person_test.rb")
496
+ assert_match_in_file(/@some_person = SomePerson.new/m, "#{@apptmp}/sample_project/test/models/some_person_test.rb")
497
+ assert_match_in_file(/assert_not_nil @some_person/m, "#{@apptmp}/sample_project/test/models/some_person_test.rb")
498
+ assert_match_in_file(/'(\/\.\.){1}\/test/m, "#{@apptmp}/sample_project/test/models/some_person_test.rb")
499
+ end
500
+
501
+ it 'should generate test file for shoulda in specified app' do
502
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=shoulda', '-d=activerecord') }
503
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
504
+ capture_io { generate(:model, 'SomePerson', "-a=/subby", "-r=#{@apptmp}/sample_project") }
505
+ assert_match_in_file(/class SomePersonTest < Test::Unit::TestCase/m, "#{@apptmp}/sample_project/test/subby/models/some_person_test.rb")
506
+ assert_match_in_file(/context "SomePerson Model"/m, "#{@apptmp}/sample_project/test/subby/models/some_person_test.rb")
507
+ assert_match_in_file(/@some_person = SomePerson.new/m, "#{@apptmp}/sample_project/test/subby/models/some_person_test.rb")
508
+ assert_match_in_file(/assert_not_nil @some_person/m, "#{@apptmp}/sample_project/test/subby/models/some_person_test.rb")
509
+ assert_match_in_file(/'(\/\.\.){2}\/test/m, "#{@apptmp}/sample_project/test/subby/models/some_person_test.rb")
510
+ end
511
+ end
512
+
513
+ describe "the model destroy option" do
514
+ module ActiveRecord
515
+ Base = Class.new
516
+ end
517
+
518
+ it 'should destroy the model file' do
519
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
520
+ capture_io { generate(:model, 'User', "-r=#{@apptmp}/sample_project") }
521
+ capture_io { generate_with_parts(:model, 'User', "-r=#{@apptmp}/sample_project", '-d') }
522
+ assert_no_file_exists("#{@apptmp}/sample_project/models/user.rb")
523
+ assert_no_file_exists("#{@apptmp}/sample_project/test/models/user_test.rb")
524
+ assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_users.rb")
525
+ end
526
+
527
+ it 'should destroy the model test file with rspec' do
528
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=rspec', '-d=activerecord') }
529
+ capture_io { generate(:model, 'User', "-r=#{@apptmp}/sample_project") }
530
+ capture_io { generate_with_parts(:model, 'User', "-r=#{@apptmp}/sample_project", '-d') }
531
+ assert_no_file_exists("#{@apptmp}/sample_project/spec/models/user_spec.rb")
532
+ end
533
+
534
+ it 'should destroy the model test file in a sub app' do
535
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=bacon', '-d=activerecord') }
536
+ capture_io { generate(:app, 'subby', "-r=#{@apptmp}/sample_project") }
537
+ capture_io { generate(:model, 'User', "-a=/subby","-r=#{@apptmp}/sample_project") }
538
+ capture_io { generate_with_parts(:model, 'User', "-a=/subby","-r=#{@apptmp}/sample_project", '-d', :apps => "subby") }
539
+ assert_no_file_exists("#{@apptmp}/sample_project/subby/models/user.rb")
540
+ assert_no_file_exists("#{@apptmp}/sample_project/test/subby/models/user_test.rb")
541
+ assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_users.rb")
542
+ end
543
+
544
+ it 'should destroy the right model migration' do
545
+ capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '--script=none', '-t=rspec', '-d=activerecord') }
546
+ capture_io { generate(:model, 'bar_foo', "-r=#{@apptmp}/sample_project") }
547
+ capture_io { generate(:model, 'foo', "-r=#{@apptmp}/sample_project") }
548
+ capture_io { generate_with_parts(:model, 'foo', "-r=#{@apptmp}/sample_project", '-d') }
549
+ assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/002_create_foos.rb")
550
+ assert_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_bar_foos.rb")
551
+ end
552
+ end
553
+ end