/test/commands/new/container_test.rb

https://gitlab.com/oytunistrator/hanami · Ruby · 310 lines · 259 code · 50 blank · 1 comment · 1 complexity · 9417883f184793dcf79f6c6b6fd16aa5 MD5 · raw file

  1. require 'test_helper'
  2. require 'hanami/commands/new/container'
  3. require 'fileutils'
  4. describe Hanami::Commands::New::Container do
  5. describe 'with invalid arguments' do
  6. it 'requires application name' do
  7. with_temp_dir do |original_wd|
  8. exception = -> { Hanami::Commands::New::Container.new({}, nil) }.must_raise ArgumentError
  9. exception.message.must_equal 'APPLICATION_NAME is required and must not contain /.'
  10. exception = -> { Hanami::Commands::New::Container.new({}, '') }.must_raise ArgumentError
  11. exception.message.must_equal 'APPLICATION_NAME is required and must not contain /.'
  12. exception = -> { Hanami::Commands::New::Container.new({}, ' ') }.must_raise ArgumentError
  13. exception.message.must_equal 'APPLICATION_NAME is required and must not contain /.'
  14. exception = -> { Hanami::Commands::New::Container.new({}, 'foo/bar') }.must_raise ArgumentError
  15. exception.message.must_equal 'APPLICATION_NAME is required and must not contain /.'
  16. end
  17. end
  18. it 'validates test option' do
  19. with_temp_dir do |original_wd|
  20. exception = -> { Hanami::Commands::New::Container.new({test: 'unknown'}, 'new_container') }.must_raise ArgumentError
  21. exception.message.must_equal "Unknown test framework 'unknown'. Please use one of 'rspec', 'minitest'"
  22. end
  23. end
  24. it 'validates database option' do
  25. with_temp_dir do |original_wd|
  26. exception = -> { Hanami::Commands::New::Container.new({database: 'unknown'}, 'new_container') }.must_raise RuntimeError
  27. exception.message.must_equal '"unknown" is not a valid database type'
  28. end
  29. end
  30. end
  31. describe 'serve static assets' do
  32. it 'sets env var to true for development and test' do
  33. with_temp_dir do |original_wd|
  34. command = Hanami::Commands::New::Container.new({}, 'static_assets')
  35. capture_io { command.start }
  36. Dir.chdir('static_assets') do
  37. actual_content = File.read('.env.development')
  38. actual_content.must_include 'SERVE_STATIC_ASSETS="true"'
  39. actual_content = File.read('.env.test')
  40. actual_content.must_include 'SERVE_STATIC_ASSETS="true"'
  41. end
  42. end
  43. end
  44. end
  45. describe 'with valid arguments' do
  46. it 'project name with dash' do
  47. with_temp_dir do |original_wd|
  48. command = Hanami::Commands::New::Container.new({}, 'new-container')
  49. capture_io { command.start }
  50. Dir.chdir('new_container') do
  51. actual_content = File.read('.env.development')
  52. actual_content.must_include 'DATABASE_URL="file:///db/new_container_development"'
  53. actual_content = File.read('.env.test')
  54. actual_content.must_include 'DATABASE_URL="file:///db/new_container_test"'
  55. end
  56. end
  57. end
  58. describe 'project name is a point' do
  59. it 'generates application in current folder' do
  60. with_temp_dir do |original_wd|
  61. command = Hanami::Commands::New::Container.new({}, '.')
  62. capture_io { command.start }
  63. Dir.chdir('test_app') do
  64. actual_content = File.read('.env.development')
  65. actual_content.must_include 'DATABASE_URL="file:///db/test_app_development"'
  66. actual_content = File.read('.env.test')
  67. actual_content.must_include 'DATABASE_URL="file:///db/test_app_test"'
  68. end
  69. end
  70. end
  71. end
  72. describe 'databases' do
  73. let(:adapter_prefix) { 'jdbc:' if Hanami::Utils.jruby? }
  74. it 'generates specific files for memory' do
  75. with_temp_dir do |original_wd|
  76. command = Hanami::Commands::New::Container.new({database: 'memory'}, 'new_container')
  77. capture_io { command.start }
  78. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  79. Dir.chdir('new_container') do
  80. actual_content = File.read('.env.development')
  81. actual_content.must_include 'DATABASE_URL="memory://localhost/new_container_development"'
  82. actual_content = File.read('.env.test')
  83. actual_content.must_include 'DATABASE_URL="memory://localhost/new_container_test"'
  84. assert_generated_file(fixture_root.join('Gemfile.memory'), 'Gemfile')
  85. assert_generated_file(fixture_root.join('lib', 'new_container.memory.rb'), 'lib/new_container.rb')
  86. assert_file_exists('db/.gitkeep')
  87. end
  88. end
  89. end
  90. it 'generates specific files for filesystem' do
  91. with_temp_dir do |original_wd|
  92. command = Hanami::Commands::New::Container.new({ database: 'filesystem' }, 'new_container')
  93. capture_io { command.start }
  94. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  95. Dir.chdir('new_container') do
  96. actual_content = File.read('.env.development')
  97. actual_content.must_include 'DATABASE_URL="file:///db/new_container_development"'
  98. actual_content = File.read('.env.test')
  99. actual_content.must_include 'DATABASE_URL="file:///db/new_container_test"'
  100. assert_generated_file(fixture_root.join('Gemfile.filesystem'), 'Gemfile')
  101. assert_generated_file(fixture_root.join('lib', 'new_container.filesystem.rb'), 'lib/new_container.rb')
  102. assert_file_exists('db/.gitkeep')
  103. end
  104. end
  105. end
  106. it 'generates specific files for sqlite3' do
  107. with_temp_dir do |original_wd|
  108. command = Hanami::Commands::New::Container.new({ database: 'sqlite3' }, 'new_container')
  109. capture_io { command.start }
  110. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  111. Dir.chdir('new_container') do
  112. actual_content = File.read('.env.development')
  113. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }sqlite://db/new_container_development.sqlite\"")
  114. actual_content = File.read('.env.test')
  115. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }sqlite://db/new_container_test.sqlite\"")
  116. assert_generated_file(fixture_root.join("Gemfile.#{ adapter_prefix }sqlite3"), 'Gemfile')
  117. assert_generated_file(fixture_root.join('lib', 'new_container.sqlite3.rb'), 'lib/new_container.rb')
  118. assert_file_exists('db/migrations/.gitkeep')
  119. end
  120. end
  121. end
  122. it 'generates specific files for postgres' do
  123. with_temp_dir do |original_wd|
  124. command = Hanami::Commands::New::Container.new({ database: 'postgres' }, 'new_container')
  125. capture_io { command.start }
  126. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  127. Dir.chdir('new_container') do
  128. actual_content = File.read('.env.development')
  129. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }postgres://localhost/new_container_development\"")
  130. actual_content = File.read('.env.test')
  131. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }postgres://localhost/new_container_test\"")
  132. assert_generated_file(fixture_root.join("Gemfile.#{ adapter_prefix }postgres"), 'Gemfile')
  133. assert_generated_file(fixture_root.join('lib', 'new_container.postgres.rb'), 'lib/new_container.rb')
  134. assert_file_exists('db/migrations/.gitkeep')
  135. end
  136. end
  137. end
  138. it 'generates specific files for mysql2' do
  139. with_temp_dir do |original_wd|
  140. database = Hanami::Utils.jruby? ? :mysql : :mysql2
  141. command = Hanami::Commands::New::Container.new({ database: 'mysql2' }, 'new_container')
  142. capture_io { command.start }
  143. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  144. Dir.chdir('new_container') do
  145. actual_content = File.read('.env.development')
  146. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }#{ database }://localhost/new_container_development\"")
  147. actual_content = File.read('.env.test')
  148. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }#{ database }://localhost/new_container_test\"")
  149. assert_generated_file(fixture_root.join("Gemfile.#{ adapter_prefix }mysql2"), 'Gemfile')
  150. assert_generated_file(fixture_root.join('lib', 'new_container.mysql2.rb'), 'lib/new_container.rb')
  151. assert_file_exists('db/migrations/.gitkeep')
  152. end
  153. end
  154. end
  155. it 'generates specific files for postgres' do
  156. with_temp_dir do |original_wd|
  157. command = Hanami::Commands::New::Container.new({ database: 'postgres' }, 'new_container')
  158. capture_io { command.start }
  159. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  160. Dir.chdir('new_container') do
  161. actual_content = File.read('.env.development')
  162. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }postgres://localhost/new_container_development\"")
  163. actual_content = File.read('.env.test')
  164. actual_content.must_include("DATABASE_URL=\"#{ adapter_prefix }postgres://localhost/new_container_test\"")
  165. assert_generated_file(fixture_root.join("Gemfile.#{ adapter_prefix }postgres"), 'Gemfile')
  166. assert_generated_file(fixture_root.join('lib', 'new_container.postgres.rb'), 'lib/new_container.rb')
  167. assert_file_exists('db/migrations/.gitkeep')
  168. end
  169. end
  170. end
  171. end
  172. describe 'hanami head' do
  173. it 'creates files' do
  174. with_temp_dir do |original_wd|
  175. command = Hanami::Commands::New::Container.new({hanami_head: true}, 'new_container')
  176. capture_io { command.start }
  177. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  178. Dir.chdir('new_container') do
  179. assert_generated_file(fixture_root.join('Gemfile.head'), 'Gemfile')
  180. end
  181. end
  182. end
  183. end
  184. describe 'template engine' do
  185. it 'creates files' do
  186. with_temp_dir do |original_wd|
  187. command = Hanami::Commands::New::Container.new({template: 'slim'}, 'new_container')
  188. capture_io { command.start }
  189. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  190. Dir.chdir('new_container') do
  191. assert_generated_file(fixture_root.join('Gemfile.slim'), 'Gemfile')
  192. assert_generated_file(fixture_root.join('.hanamirc.slim'), '.hanamirc')
  193. end
  194. end
  195. end
  196. end
  197. describe 'mounted at a specific path' do
  198. it 'mounts at /mypath' do
  199. with_temp_dir do |original_wd|
  200. command = Hanami::Commands::New::Container.new({application_base_url: '/mypath'}, 'new_container')
  201. capture_io { command.start }
  202. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  203. Dir.chdir('new_container') do
  204. assert_generated_file(fixture_root.join('config', 'environment_mypath.rb'), 'config/environment.rb')
  205. end
  206. end
  207. end
  208. end
  209. describe 'with rspec' do
  210. it 'creates the app files' do
  211. with_temp_dir do |original_wd|
  212. command = Hanami::Commands::New::Container.new({test: 'rspec'}, 'new_container')
  213. capture_io { command.start }
  214. assert_generated_container('rspec', original_wd)
  215. end
  216. end
  217. end
  218. describe 'with minitest' do
  219. it 'creates files' do
  220. with_temp_dir do |original_wd|
  221. command = Hanami::Commands::New::Container.new({}, 'new_container')
  222. capture_io { command.start }
  223. assert_generated_container('minitest', original_wd)
  224. end
  225. end
  226. end
  227. end
  228. def assert_generated_container(test_framework, original_wd)
  229. fixture_root = original_wd.join('test', 'fixtures', 'commands', 'application', 'new_container')
  230. Dir.chdir('new_container') do
  231. assert_generated_file(fixture_root.join(".hanamirc.#{ test_framework }"), '.hanamirc')
  232. actual_content = File.read('.env.development')
  233. actual_content.must_include 'DATABASE_URL="file:///db/new_container_development"'
  234. actual_content.must_match(%r{WEB_SESSIONS_SECRET="[\w]{64}"})
  235. actual_content = File.read('.env.test')
  236. actual_content.must_include 'DATABASE_URL="file:///db/new_container_test"'
  237. actual_content.must_match %r{WEB_SESSIONS_SECRET="[\w]{64}"}
  238. assert_generated_file(fixture_root.join("Gemfile.#{ test_framework }"), 'Gemfile')
  239. assert_generated_file(fixture_root.join('config.ru'), 'config.ru')
  240. assert_generated_file(fixture_root.join('config', 'environment.rb'), 'config/environment.rb')
  241. assert_generated_file(fixture_root.join('lib', 'new_container.rb'), 'lib/new_container.rb')
  242. assert_file_exists('config/initializers/.gitkeep')
  243. assert_file_exists('lib/new_container/entities/.gitkeep')
  244. assert_file_exists('lib/new_container/repositories/.gitkeep')
  245. assert_file_exists('lib/new_container/mailers/.gitkeep')
  246. assert_file_exists('lib/new_container/mailers/templates/.gitkeep')
  247. assert_file_exists('spec/new_container/entities/.gitkeep')
  248. assert_file_exists('spec/new_container/repositories/.gitkeep')
  249. assert_file_exists('spec/new_container/mailers/.gitkeep')
  250. assert_file_exists('spec/support/.gitkeep')
  251. assert_file_exists('db/.gitkeep')
  252. assert_file_exists('.git')
  253. assert_generated_file(fixture_root.join("Rakefile.#{ test_framework }"), 'Rakefile')
  254. assert_generated_file(fixture_root.join('spec', "spec_helper.#{ test_framework }.rb"), 'spec/spec_helper.rb')
  255. assert_generated_file(fixture_root.join('spec', "features_helper.#{ test_framework }.rb"), 'spec/features_helper.rb')
  256. assert_generated_file(fixture_root.join('.gitignore.fixture'), '.gitignore')
  257. # other files are tested by app generator
  258. end
  259. end
  260. end