Advertisement
Guest User

Untitled

a guest
Jul 29th, 2017
425
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.29 KB | None | 0 0
  1. require 'minitest'
  2. require "minitest/autorun"
  3. require "minitest/focus"
  4. require 'rake'
  5. require 'mocha/mini_test'
  6. require 'minitest/pride'
  7.  
  8. module Padrino
  9. module Generators
  10. # Wrap the sequel rake task
  11. class SequelRakeWrapper
  12. # A basic initialize method.
  13. #
  14. # @param sequel [Sequel]
  15. # @param sequel_migrator [Sequel::Migrator]
  16. # @param sequel_model [Sequel::Model]
  17. # @param sql_helpers [Padrino::Generators::SqlHelpers|nil]
  18. def initialize(sequel, sequel_migrator, sequel_model, sql_helpers = nil)
  19. @sequel = sequel
  20. @sequel_migrator = sequel_migrator
  21. @sequel_model = sequel_model
  22. @sql_helpers = sql_helpers
  23. end
  24.  
  25. # Perform automigration (reset your db data)
  26. # @return [nil]
  27. def auto
  28. @sequel.extension :migration
  29. @sequel_migrator.run @sequel_model.db, 'db/migrate', :target => 0
  30. @sequel_migrator.run @sequel_model.db, 'db/migrate'
  31. puts '<= sq:migrate:auto executed'
  32. end
  33.  
  34. # Perform migration up/down to MIGRATION_VERSION
  35. #
  36. # @param version [String|nil]
  37. def to(version = nil)
  38. @sequel.extension :migration
  39. fail "No MIGRATION_VERSION was provided" if version.nil?
  40. @sequel_migrator.apply @sequel_model.db, 'db/migrate', version.to_i
  41. puts "<= sq:migrate:to[#{version}] executed"
  42. end
  43.  
  44. # Perform migration up to latest migration available
  45. def up
  46. @sequel.extension :migration
  47. @sequel_migrator.run @sequel_model.db, 'db/migrate'
  48. puts '<= sq:migrate:up executed'
  49. end
  50.  
  51. # Perform migration down (erase all data)
  52. def down
  53. @sequel.extension :migration
  54. @sequel_migrator.run @sequel_model.db, 'db/migrate', :target => 0
  55. puts '<= sq:migrate:down executed'
  56. end
  57.  
  58. # Create the database
  59. def create
  60. config = @sequel_model.db.opts
  61. user, password, host = config[:user], config[:password], config[:host]
  62.  
  63. database = config[:database]
  64. charset = config[:charset] || ENV['CHARSET'] || 'utf8'
  65. collation = config[:collation] || ENV['COLLATION'] || 'utf8_unicode_ci'
  66.  
  67. puts "=> Creating database '#{database}'"
  68. if config[:adapter] == 'sqlite3'
  69. @sequel.sqlite(database)
  70. else
  71. require 'padrino-gen/padrino-tasks/sql-helpers'
  72. @sql_helpers.create_db config[:adapter], config[:user], config[:password], config[:host], config[:database], charset, collation
  73. end
  74. puts "<= sq:create executed"
  75. end
  76.  
  77. # Drop the database (postgres and mysql only)
  78. def drop
  79. config = @sequel_model.db.opts
  80.  
  81. user, password, host, database = config[:user], config[:password], config[:host], config[:database]
  82.  
  83. @sequel_model.db.disconnect
  84.  
  85. puts "=> Dropping database '#{database}'"
  86. if config[:adapter] == 'sqlite3'
  87. File.delete(database) if File.exist?(database)
  88. else
  89. @sql_helpers.drop_db config[:adapter], user, password, host, database
  90. end
  91. puts "<= sq:drop executed"
  92. end
  93.  
  94. # Performs the seed command to fill the database
  95. def seed
  96. missing_model_features = Padrino.send(:default_dependency_paths) - Padrino.send(:dependency_paths)
  97.  
  98. Padrino.require_dependencies(missing_model_features)
  99. Rake::Task['db:seed'].invoke
  100. end
  101.  
  102. # Grab the migration version from ENV
  103. def env_mig_version
  104. version = ENV["MIGRATION_VERSION"]
  105. if version.nil? && ENV["VERSION"]
  106. deprecated = true
  107. warn "Environment variable VERSION is deprecated, use MIGRATION_VERSION"
  108. version = ENV["VERSION"]
  109. end
  110. version ? Integer(version) : nil
  111. rescue ArgumentError
  112. warn "Environment variable #{deprecated ? '' : 'MIGRATION_'}VERSION=#{version} should be non-existant or Integer"
  113. nil
  114. end
  115. end
  116. end
  117. end
  118.  
  119. namespace :db do
  120. task :seed
  121. end
  122.  
  123. describe Padrino::Generators::SequelRakeWrapper do
  124. let(:sequel_mock) { mock }
  125. let(:sequel_migrator_mock) { mock }
  126. let(:sequel_model_mock) { mock }
  127. let(:sql_helpers_mock) { mock }
  128. let(:sequel_db_opts_mock) { mock }
  129. let(:db_mock) { mock }
  130. let(:disconnect_mock) {mock }
  131.  
  132. it "#auto" do
  133. sequel_mock.stubs(:extension).with(:migration).once
  134.  
  135. sequel_model_mock.stubs(:db).at_most(2).returns(db_mock)
  136.  
  137. sequel_migrator_mock.stubs(:run).with(db_mock, 'db/migrate', :target => 0).once
  138. sequel_migrator_mock.stubs(:run).with(db_mock, 'db/migrate').once
  139.  
  140. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  141. assert_output(/<= sq:migrate:auto executed/) { sequel_wrapper.auto }
  142. end
  143.  
  144. describe "#to" do
  145. it "throws error if 'version' is not given" do
  146. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  147.  
  148. sequel_mock.stubs(:extension).with(:migration).once
  149.  
  150. exception = assert_raises RuntimeError do
  151. sequel_wrapper.to
  152. end
  153. assert_equal 'No MIGRATION_VERSION was provided', exception.message
  154. end
  155.  
  156. it "migrates to the given 'version'" do
  157. sequel_mock.stubs(:extension).with(:migration).once
  158.  
  159. sequel_model_mock.stubs(:db).once.returns(db_mock)
  160. sequel_migrator_mock.stubs(:apply).with(db_mock, 'db/migrate', 1).once
  161.  
  162. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  163.  
  164. assert_output(/<= sq:migrate:to\[1\] executed/) { sequel_wrapper.to(1) }
  165. end
  166. end
  167.  
  168. describe "#up" do
  169. it "it migrates to the latest version" do
  170. sequel_mock.stubs(:extension).with(:migration).once
  171.  
  172. sequel_model_mock.stubs(:db).once.returns(db_mock)
  173.  
  174. sequel_migrator_mock.stubs(:run).with(db_mock, 'db/migrate').once
  175.  
  176. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  177.  
  178. assert_output(/<= sq:migrate:up executed/) { sequel_wrapper.up }
  179. end
  180. end
  181.  
  182. describe "#down" do
  183. it "erases all data" do
  184. sequel_mock.stubs(:extension).with(:migration).once
  185.  
  186. sequel_model_mock.stubs(:db).once.returns(db_mock)
  187.  
  188. sequel_migrator_mock.stubs(:run).with(db_mock, 'db/migrate', :target => 0).once
  189.  
  190. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  191.  
  192. assert_output(/<= sq:migrate:down executed/) { sequel_wrapper.down }
  193. end
  194. end
  195.  
  196. describe "#create" do
  197. it "creates locale database with 'sqlite' adapter" do
  198. expected_credentials = {
  199. database: 'mochadatabase',
  200. adapter: 'sqlite3'
  201. }
  202.  
  203. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  204. sequel_model_mock.stubs(:db).once.returns(sequel_db_opts_mock)
  205.  
  206. sequel_mock.stubs(:sqlite).with('mochadatabase').once
  207.  
  208. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  209.  
  210. expected_output = "=> Creating database 'mochadatabase'\n<= sq:create executed\n"
  211. assert_output (expected_output) { sequel_wrapper.create }
  212. end
  213.  
  214. it "creates sql database with for given credentials and charset and collation" do
  215. expected_credentials = {
  216. database: 'mochadatabase',
  217. adapter: 'mochiadapter',
  218. user: 'mochamocha',
  219. password: 'mochikochi',
  220. host: 'padrinoovertheworld',
  221. charset: 'mochi_utf8',
  222. collation: 'mochi_utf8_unicode_ci'
  223. }
  224.  
  225. sequel_model_mock.stubs(:db).once.returns(sequel_db_opts_mock)
  226. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  227.  
  228. sequel_mock.stubs(:sqlite).with('mochadatabase').never
  229. sql_helpers_mock.stubs(:create_db).with('mochiadapter', 'mochamocha', 'mochikochi', 'padrinoovertheworld', 'mochadatabase', 'mochi_utf8', 'mochi_utf8_unicode_ci').once
  230.  
  231. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock, sql_helpers_mock)
  232.  
  233. expected_output = "=> Creating database 'mochadatabase'\n<= sq:create executed\n"
  234.  
  235. clear_sql_helpers_from_loaded_features
  236. assert_equal false, $LOADED_FEATURES.grep(%r{padrino-gen/padrino-tasks/sql-helpers}).any?
  237.  
  238. assert_output (expected_output) { sequel_wrapper.create }
  239.  
  240. assert_equal true, $LOADED_FEATURES.grep(%r{padrino-gen/padrino-tasks/sql-helpers}).any?
  241. end
  242.  
  243. describe "collation and charset" do
  244. it "taking values from ENV" do
  245. expected_credentials = {
  246. database: 'mochadatabase',
  247. adapter: 'mochiadapter',
  248. user: 'mochamocha',
  249. password: 'mochikochi',
  250. host: 'padrinoovertheworld'
  251. }
  252. ENV['CHARSET'] = 'mochi_utf8'
  253. ENV['COLLATION'] = 'mochi_utf8_unicode_ci'
  254.  
  255. sequel_model_mock.stubs(:db).once.returns(sequel_db_opts_mock)
  256. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  257.  
  258. sequel_mock.stubs(:sqlite).with('mochadatabase').never
  259. sql_helpers_mock.stubs(:create_db).with('mochiadapter', 'mochamocha', 'mochikochi', 'padrinoovertheworld', 'mochadatabase', 'mochi_utf8', 'mochi_utf8_unicode_ci').once
  260.  
  261. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock, sql_helpers_mock)
  262.  
  263. expected_output = "=> Creating database 'mochadatabase'\n<= sq:create executed\n"
  264.  
  265. clear_sql_helpers_from_loaded_features
  266.  
  267. assert_equal false, $LOADED_FEATURES.grep(%r{padrino-gen/padrino-tasks/sql-helpers}).any?
  268.  
  269. assert_output (expected_output) { sequel_wrapper.create }
  270. assert_equal true, $LOADED_FEATURES.grep(%r{padrino-gen/padrino-tasks/sql-helpers}).any?
  271. end
  272.  
  273. it "taking default values" do
  274. expected_credentials = {
  275. database: 'mochadatabase',
  276. adapter: 'mochiadapter',
  277. user: 'mochamocha',
  278. password: 'mochikochi',
  279. host: 'padrinoovertheworld'
  280. }
  281.  
  282. ENV['CHARSET'] = nil
  283. ENV['COLLATION'] = nil
  284.  
  285. sequel_model_mock.stubs(:db).once.returns(sequel_db_opts_mock)
  286. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  287.  
  288. sequel_mock.stubs(:sqlite).with('mochadatabase').never
  289. sql_helpers_mock.stubs(:create_db).with('mochiadapter', 'mochamocha', 'mochikochi', 'padrinoovertheworld', 'mochadatabase', 'utf8', 'utf8_unicode_ci').once
  290.  
  291. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock, sql_helpers_mock)
  292.  
  293. clear_sql_helpers_from_loaded_features
  294.  
  295. assert_equal false, $LOADED_FEATURES.grep(%r{padrino-gen/padrino-tasks/sql-helpers}).any?
  296.  
  297. expected_output = "=> Creating database 'mochadatabase'\n<= sq:create executed\n"
  298. assert_output (expected_output) { sequel_wrapper.create }
  299. assert_equal true, $LOADED_FEATURES.grep(%r{padrino-gen/padrino-tasks/sql-helpers}).any?
  300. end
  301. end
  302. end
  303.  
  304. describe "#drop" do
  305. describe "sqlite adapter" do
  306. it "deletes the database if it's there" do
  307. expected_credentials = {
  308. database: 'mochadatabase',
  309. adapter: 'sqlite3',
  310. }
  311.  
  312. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  313.  
  314. disconnect_mock.stubs(:disconnect).once
  315.  
  316. sequel_model_mock.stubs(:db).at_most(2).returns(sequel_db_opts_mock, disconnect_mock)
  317.  
  318. File.stubs(:exist?).once.with('mochadatabase').returns(true)
  319. File.stubs(:delete).once.with('mochadatabase')
  320.  
  321. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  322.  
  323. expected_output = "=> Dropping database 'mochadatabase'\n<= sq:drop executed\n"
  324. assert_output (expected_output) { sequel_wrapper.drop }
  325. end
  326.  
  327. it "does not deletes the database if it's not there" do
  328. expected_credentials = {
  329. database: 'mochadatabase',
  330. adapter: 'sqlite3'
  331. }
  332.  
  333. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  334.  
  335. disconnect_mock.stubs(:disconnect).once
  336.  
  337. sequel_model_mock.stubs(:db).at_most(2).returns(sequel_db_opts_mock, disconnect_mock)
  338.  
  339. File.stubs(:exist?).once.with('mochadatabase').returns(false)
  340. File.stubs(:delete).never.with('mochadatabase')
  341.  
  342. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  343.  
  344. expected_output = "=> Dropping database 'mochadatabase'\n<= sq:drop executed\n"
  345. assert_output (expected_output) { sequel_wrapper.drop }
  346. end
  347. end
  348. describe "with no 'sqlite' adapter" do
  349. it "drops the database" do
  350. expected_credentials = {
  351. database: 'mochadatabase',
  352. adapter: 'mochiadapter',
  353. user: 'mochamocha',
  354. password: 'mochikochi',
  355. host: 'padrinoovertheworld',
  356. charset: 'mochi_utf8',
  357. collation: 'mochi_utf8_unicode_ci'
  358. }
  359.  
  360. sequel_db_opts_mock.stubs(:opts).once.returns(expected_credentials)
  361.  
  362. disconnect_mock.stubs(:disconnect).once
  363.  
  364. sequel_model_mock.stubs(:db).at_most(2).returns(sequel_db_opts_mock, disconnect_mock)
  365.  
  366. sql_helpers_mock.stubs(:drop_db).with('mochiadapter', 'mochamocha', 'mochikochi', 'padrinoovertheworld', 'mochadatabase').once
  367.  
  368. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock, sql_helpers_mock)
  369.  
  370. expected_output = "=> Dropping database 'mochadatabase'\n<= sq:drop executed\n"
  371. assert_output (expected_output) { sequel_wrapper.drop }
  372. end
  373. end
  374. end
  375.  
  376. describe "#seed" do
  377. it "performs the seed to command to fill the database" do
  378. Padrino.stubs(:send).once.with(:default_dependency_paths).returns(2)
  379. Padrino.stubs(:send).once.with(:dependency_paths).returns(1)
  380. Padrino.stubs(:require_dependencies).once.with(1)
  381. Rake::Task['db:seed'].stubs(:invoke).once
  382.  
  383. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  384.  
  385. sequel_wrapper.seed
  386. end
  387. end
  388.  
  389. describe "#env_mig_version" do
  390. it "Deprecation message if only VERSION is given and MIGRATION_VERSION is not given" do
  391. ENV['MIGRATION_VERSION'] = nil
  392. ENV['VERSION'] = '1'
  393.  
  394. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  395. assert_output(nil, /Environment variable VERSION is deprecated, use MIGRATION_VERSION/) { assert_equal 1, sequel_wrapper.env_mig_version }
  396. end
  397.  
  398. it "MIGRATION_VERSION is a valid number" do
  399. ENV['MIGRATION_VERSION'] = '1'
  400. ENV['VERSION'] = nil
  401.  
  402. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  403.  
  404. assert_equal 1, sequel_wrapper.env_mig_version
  405. end
  406.  
  407. it "MIGRATION_VERSION is not a number" do
  408. ENV['MIGRATION_VERSION'] = 'a'
  409.  
  410. sequel_wrapper = Padrino::Generators::SequelRakeWrapper.new(sequel_mock, sequel_migrator_mock, sequel_model_mock)
  411.  
  412. assert_output(nil, /Environment variable MIGRATION_VERSION=a should be non-existant or Integer/) { assert_nil sequel_wrapper.env_mig_version }
  413. end
  414. end
  415. end
  416.  
  417. private
  418.  
  419. def clear_sql_helpers_from_loaded_features
  420. sql_helpers_index = $LOADED_FEATURES.index { |s| s.include?('padrino-gen/padrino-tasks/sql-helpers.rb')}
  421.  
  422. $LOADED_FEATURES.delete_at sql_helpers_index if sql_helpers_index
  423. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement