maquina-generators 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +158 -0
  4. data/Rakefile +10 -0
  5. data/lib/generators/maquina/clave/USAGE +11 -0
  6. data/lib/generators/maquina/clave/clave_generator.rb +184 -0
  7. data/lib/generators/maquina/clave/templates/app/controllers/concerns/authentication.rb.tt +63 -0
  8. data/lib/generators/maquina/clave/templates/app/controllers/registration/verification_resends_controller.rb.tt +38 -0
  9. data/lib/generators/maquina/clave/templates/app/controllers/registration/verifications_controller.rb.tt +51 -0
  10. data/lib/generators/maquina/clave/templates/app/controllers/registrations_controller.rb.tt +63 -0
  11. data/lib/generators/maquina/clave/templates/app/controllers/session/verification_resends_controller.rb.tt +44 -0
  12. data/lib/generators/maquina/clave/templates/app/controllers/session/verifications_controller.rb.tt +55 -0
  13. data/lib/generators/maquina/clave/templates/app/controllers/sessions_controller.rb.tt +56 -0
  14. data/lib/generators/maquina/clave/templates/app/helpers/authentication_helper.rb.tt +20 -0
  15. data/lib/generators/maquina/clave/templates/app/jobs/authentication_cleanup_job.rb.tt +13 -0
  16. data/lib/generators/maquina/clave/templates/app/mailers/verification_mailer.rb.tt +15 -0
  17. data/lib/generators/maquina/clave/templates/app/models/current.rb.tt +4 -0
  18. data/lib/generators/maquina/clave/templates/app/models/email_verification.rb.tt +40 -0
  19. data/lib/generators/maquina/clave/templates/app/models/session.rb.tt +18 -0
  20. data/lib/generators/maquina/clave/templates/app/models/user.rb.tt +38 -0
  21. data/lib/generators/maquina/clave/templates/app/views/registration/verifications/new.html.erb.tt +42 -0
  22. data/lib/generators/maquina/clave/templates/app/views/registrations/new.html.erb.tt +38 -0
  23. data/lib/generators/maquina/clave/templates/app/views/session/verifications/new.html.erb.tt +42 -0
  24. data/lib/generators/maquina/clave/templates/app/views/sessions/new.html.erb.tt +39 -0
  25. data/lib/generators/maquina/clave/templates/app/views/verification_mailer/verification_code.html.erb.tt +37 -0
  26. data/lib/generators/maquina/clave/templates/app/views/verification_mailer/verification_code.text.erb.tt +11 -0
  27. data/lib/generators/maquina/clave/templates/config/locales/clave.en.yml +101 -0
  28. data/lib/generators/maquina/clave/templates/config/locales/clave.es.yml +101 -0
  29. data/lib/generators/maquina/clave/templates/migration_create_email_verifications.rb.tt +17 -0
  30. data/lib/generators/maquina/clave/templates/migration_create_sessions.rb.tt +12 -0
  31. data/lib/generators/maquina/clave/templates/migration_create_users.rb.tt +16 -0
  32. data/lib/generators/maquina/clave/templates/test/test_helpers/session_test_helper.rb.tt +19 -0
  33. data/lib/generators/maquina/mission_control_jobs/USAGE +14 -0
  34. data/lib/generators/maquina/mission_control_jobs/mission_control_jobs_generator.rb +75 -0
  35. data/lib/generators/maquina/mission_control_jobs/templates/app/controllers/backstage_controller.rb.tt +4 -0
  36. data/lib/generators/maquina/mission_control_jobs/templates/config/initializers/mission_control.rb.tt +10 -0
  37. data/lib/generators/maquina/solid_errors/USAGE +15 -0
  38. data/lib/generators/maquina/solid_errors/solid_errors_generator.rb +85 -0
  39. data/lib/generators/maquina/solid_errors/templates/app/controllers/backstage_controller.rb.tt +4 -0
  40. data/lib/generators/maquina/solid_errors/templates/config/initializers/solid_errors.rb.tt +10 -0
  41. data/lib/maquina_generators/version.rb +3 -0
  42. data/lib/maquina_generators.rb +1 -0
  43. data/test/generators/maquina/clave_generator_test.rb +187 -0
  44. data/test/generators/maquina/mission_control_jobs_generator_test.rb +97 -0
  45. data/test/generators/maquina/solid_errors_generator_test.rb +97 -0
  46. data/test/test_helper.rb +7 -0
  47. data/test/tmp/Gemfile +3 -0
  48. data/test/tmp/app/controllers/backstage_controller.rb +4 -0
  49. data/test/tmp/config/initializers/solid_errors.rb +10 -0
  50. data/test/tmp/config/routes.rb +3 -0
  51. metadata +134 -0
@@ -0,0 +1,101 @@
1
+ es:
2
+ flash:
3
+ sessions:
4
+ create:
5
+ success: "Has iniciado sesion correctamente."
6
+ destroy:
7
+ success: "Has cerrado sesion correctamente."
8
+ code_sent: "Te enviamos un codigo de verificacion."
9
+ invalid_code: "El codigo es incorrecto. Por favor, intenta de nuevo."
10
+ code_expired: "El codigo ha expirado. Solicita uno nuevo."
11
+ code_resent: "Te enviamos un nuevo codigo."
12
+ cooldown: "Debes esperar %{minutes} minutos antes de solicitar otro codigo."
13
+ code_already_sent: "Ya te enviamos un codigo. Revisa tu correo (incluyendo spam). Podras solicitar uno nuevo en %{minutes} minutos."
14
+ registrations:
15
+ create:
16
+ success: "Tu cuenta ha sido creada. Bienvenido!"
17
+ code_sent: "Te enviamos un codigo de verificacion a tu correo."
18
+ email_plus_not_allowed: "No se permiten correos con '+'. Usa tu direccion principal sin alias."
19
+ email_taken: "Ya existe una cuenta con este correo. Quieres iniciar sesion?"
20
+ invalid_code: "El codigo es incorrecto. Por favor, intenta de nuevo."
21
+ code_expired: "El codigo ha expirado. Solicita uno nuevo."
22
+ code_resent: "Te enviamos un nuevo codigo."
23
+ cooldown: "Debes esperar %{minutes} minutos antes de solicitar otro codigo."
24
+ code_already_sent: "Ya te enviamos un codigo. Revisa tu correo (incluyendo spam). Podras solicitar uno nuevo en %{minutes} minutos."
25
+ general:
26
+ unauthorized: "Debes iniciar sesion para acceder a esta pagina."
27
+ forbidden: "No tienes permiso para realizar esta accion."
28
+ not_found: "El recurso que buscas no existe."
29
+ rate_limited: "Demasiados intentos. Por favor, espera unos minutos e intenta de nuevo."
30
+
31
+ sessions:
32
+ new:
33
+ title: "Iniciar sesion"
34
+ email: "Correo electronico"
35
+ email_placeholder: "tu@correo.com"
36
+ email_instructions: "Ingresa tu correo y te enviaremos un codigo de 6 digitos."
37
+ spam_note: "Revisa tu carpeta de spam si no recibes el correo."
38
+ submit: "Enviar codigo"
39
+ no_account: "No tienes cuenta?"
40
+ sign_up: "Registrate"
41
+
42
+ session:
43
+ verifications:
44
+ new:
45
+ title: "Verifica tu identidad"
46
+ sent_to: "Si tienes cuenta, enviamos un codigo a %{email}"
47
+ enter_code: "Ingresa el codigo"
48
+ submit: "Iniciar sesion"
49
+ check_spam: "Revisa tu carpeta de spam."
50
+ didnt_receive: "No recibiste el codigo?"
51
+ resend: "Reenviar codigo"
52
+
53
+ registrations:
54
+ new:
55
+ title: "Crear cuenta"
56
+ email: "Correo electronico"
57
+ email_placeholder: "tu@correo.com"
58
+ email_instructions: "Ingresa tu correo electronico. Te enviaremos un codigo de 6 digitos para verificar tu cuenta."
59
+ spam_note: "Revisa tu carpeta de spam si no recibes el correo."
60
+ submit: "Enviar codigo"
61
+ have_account: "Ya tienes cuenta?"
62
+ sign_in: "Inicia sesion"
63
+
64
+ registration:
65
+ verifications:
66
+ new:
67
+ title: "Verifica tu correo"
68
+ sent_to: "Enviamos un codigo de 6 digitos a %{email}"
69
+ enter_code: "Ingresa el codigo"
70
+ submit: "Verificar"
71
+ check_spam: "Revisa tu carpeta de spam si no lo recibes."
72
+ didnt_receive: "No recibiste el codigo?"
73
+ resend: "Reenviar codigo"
74
+
75
+ verification_mailer:
76
+ verification_code:
77
+ subject: "Tu codigo de verificacion"
78
+ title: "Codigo de verificacion"
79
+ instructions: "Ingresa este codigo para continuar:"
80
+ expires_in: "Este codigo expira en 15 minutos."
81
+ ignore_if_not_you: "Si no solicitaste este codigo, puedes ignorar este correo."
82
+
83
+ activerecord:
84
+ models:
85
+ user:
86
+ one: "Usuario"
87
+ other: "Usuarios"
88
+ attributes:
89
+ user:
90
+ email_address: "Correo electronico"
91
+ name: "Nombre"
92
+ password: "Contrasena"
93
+ locale: "Idioma"
94
+ blocked_at: "Bloqueado en"
95
+ blocked_reason: "Razon de bloqueo"
96
+ errors:
97
+ models:
98
+ user:
99
+ attributes:
100
+ email_address:
101
+ plus_not_allowed: "No se permiten direcciones con '+'. Por favor, usa tu correo principal sin alias."
@@ -0,0 +1,17 @@
1
+ class CreateEmailVerifications < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :email_verifications do |t|
4
+ t.string :email, null: false
5
+ t.string :code, null: false
6
+ t.string :verification_type, null: false
7
+ t.datetime :expires_at, null: false
8
+ t.datetime :verified_at
9
+ t.integer :attempts, default: 0
10
+ t.string :locale
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ add_index :email_verifications, [:email, :created_at]
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ class CreateSessions < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :sessions do |t|
4
+ t.references :user, null: false, foreign_key: true
5
+ t.string :ip_address
6
+ t.string :user_agent
7
+ t.datetime :expires_at
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ class CreateUsers < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :email_address, null: false
5
+ t.string :password_digest, null: false
6
+ t.string :name
7
+ t.string :locale
8
+ t.datetime :blocked_at
9
+ t.text :blocked_reason
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :users, :email_address, unique: true
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module SessionTestHelper
2
+ def sign_in_as(user)
3
+ Current.session = user.sessions.create!
4
+
5
+ ActionDispatch::TestRequest.create.cookie_jar.tap do |cookie_jar|
6
+ cookie_jar.signed[:session_id] = Current.session.id
7
+ cookies["session_id"] = cookie_jar[:session_id]
8
+ end
9
+ end
10
+
11
+ def sign_out
12
+ Current.session&.destroy!
13
+ cookies.delete("session_id")
14
+ end
15
+ end
16
+
17
+ ActiveSupport.on_load(:action_dispatch_integration_test) do
18
+ include SessionTestHelper
19
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Installs Mission Control Jobs with HTTP authentication and engine mounting.
3
+
4
+ Generates an initializer, adds routes, and creates a BackstageController.
5
+
6
+ Authentication tries Rails credentials (backstage.username/password)
7
+ first, then falls back to environment variables.
8
+
9
+ Examples:
10
+ rails g maquina:mission_control_jobs --prefix /admin
11
+
12
+ rails g maquina:mission_control_jobs --prefix /backstage \
13
+ --user-env-var ADMIN_USER \
14
+ --password-env-var ADMIN_PASSWORD
@@ -0,0 +1,75 @@
1
+ require "rails/generators"
2
+
3
+ module Maquina
4
+ module Generators
5
+ class MissionControlJobsGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ class_option :prefix, type: :string, required: true,
9
+ desc: "Base path prefix (e.g. /admin)"
10
+ class_option :user_env_var, type: :string, default: "MISSION_CONTROL_JOBS_USER",
11
+ desc: "Environment variable for HTTP auth username"
12
+ class_option :password_env_var, type: :string, default: "MISSION_CONTROL_JOBS_PASSWORD",
13
+ desc: "Environment variable for HTTP auth password"
14
+
15
+ # 1. BackstageController
16
+ def create_backstage_controller
17
+ backstage_path = "app/controllers/backstage_controller.rb"
18
+ return if File.exist?(File.join(destination_root, backstage_path))
19
+
20
+ template "app/controllers/backstage_controller.rb.tt", backstage_path
21
+ end
22
+
23
+ # 2. Initializer
24
+ def create_initializer
25
+ template "config/initializers/mission_control.rb.tt",
26
+ "config/initializers/mission_control.rb"
27
+ end
28
+
29
+ # 3. Add gem to Gemfile
30
+ def add_gem
31
+ gemfile_path = File.join(destination_root, "Gemfile")
32
+ if File.exist?(gemfile_path)
33
+ content = File.read(gemfile_path)
34
+ unless content.include?('gem "mission_control-jobs"')
35
+ append_to_file "Gemfile", "\ngem \"mission_control-jobs\"\n"
36
+ end
37
+ end
38
+ end
39
+
40
+ # 4. Routes
41
+ def add_route
42
+ mount_path = "#{options[:prefix]}/mission_control_jobs"
43
+
44
+ route "mount MissionControl::Jobs::Engine, at: \"#{mount_path}\""
45
+ end
46
+
47
+ # 5. Bundle install
48
+ def run_bundle_install
49
+ return unless rails_app?
50
+
51
+ run "bundle install", capture: true
52
+ end
53
+
54
+ # 6. Post-install message
55
+ def show_post_install
56
+ say ""
57
+ say "Mission Control Jobs has been installed!", :green
58
+ say ""
59
+ say "Configuration:", :yellow
60
+ say " - Set credentials: bin/rails credentials:edit"
61
+ say " backstage:"
62
+ say " username: your_user"
63
+ say " password: your_password"
64
+ say " - Or set ENV vars: #{options[:user_env_var]}, #{options[:password_env_var]}"
65
+ say ""
66
+ end
67
+
68
+ private
69
+
70
+ def rails_app?
71
+ File.exist?(File.join(destination_root, "bin/rails"))
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class BackstageController < ActionController::Base
4
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.configure do
4
+ config.mission_control.jobs.base_controller_class = "BackstageController"
5
+
6
+ backstage = Rails.application.credentials.backstage || {}
7
+
8
+ MissionControl::Jobs.http_basic_auth_user = backstage[:username] || ENV.fetch("<%= options[:user_env_var] %>", nil)
9
+ MissionControl::Jobs.http_basic_auth_password = backstage[:password] || ENV.fetch("<%= options[:password_env_var] %>", nil)
10
+ end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Installs Solid Errors with HTTP authentication and engine mounting.
3
+
4
+ Generates an initializer, adds routes, creates a BackstageController,
5
+ and runs the solid_errors:install generator.
6
+
7
+ Authentication tries Rails credentials (backstage.username/password)
8
+ first, then falls back to environment variables.
9
+
10
+ Examples:
11
+ rails g maquina:solid_errors --prefix /admin
12
+
13
+ rails g maquina:solid_errors --prefix /backstage \
14
+ --user-env-var ADMIN_USER \
15
+ --password-env-var ADMIN_PASSWORD
@@ -0,0 +1,85 @@
1
+ require "rails/generators"
2
+
3
+ module Maquina
4
+ module Generators
5
+ class SolidErrorsGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ class_option :prefix, type: :string, required: true,
9
+ desc: "Base path prefix (e.g. /admin)"
10
+ class_option :user_env_var, type: :string, default: "SOLID_ERRORS_USER",
11
+ desc: "Environment variable for HTTP auth username"
12
+ class_option :password_env_var, type: :string, default: "SOLID_ERRORS_PASSWORD",
13
+ desc: "Environment variable for HTTP auth password"
14
+
15
+ # 1. BackstageController
16
+ def create_backstage_controller
17
+ backstage_path = "app/controllers/backstage_controller.rb"
18
+ return if File.exist?(File.join(destination_root, backstage_path))
19
+
20
+ template "app/controllers/backstage_controller.rb.tt", backstage_path
21
+ end
22
+
23
+ # 2. Initializer
24
+ def create_initializer
25
+ template "config/initializers/solid_errors.rb.tt",
26
+ "config/initializers/solid_errors.rb"
27
+ end
28
+
29
+ # 3. Add gem to Gemfile
30
+ def add_gem
31
+ gemfile_path = File.join(destination_root, "Gemfile")
32
+ if File.exist?(gemfile_path)
33
+ content = File.read(gemfile_path)
34
+ unless content.include?('gem "solid_errors"')
35
+ append_to_file "Gemfile", "\ngem \"solid_errors\"\n"
36
+ end
37
+ end
38
+ end
39
+
40
+ # 4. Routes
41
+ def add_route
42
+ mount_path = "#{options[:prefix]}/solid_errors"
43
+
44
+ route "mount SolidErrors::Engine, at: \"#{mount_path}\""
45
+ end
46
+
47
+ # 5. Bundle install
48
+ def run_bundle_install
49
+ return unless rails_app?
50
+
51
+ run "bundle install", capture: true
52
+ end
53
+
54
+ # 6. Run solid_errors:install
55
+ def run_gem_install
56
+ return unless rails_app?
57
+
58
+ run "bin/rails generate solid_errors:install", capture: true
59
+ end
60
+
61
+ # 7. Post-install message
62
+ def show_post_install
63
+ say ""
64
+ say "Solid Errors has been installed!", :green
65
+ say ""
66
+ say "Next steps:", :yellow
67
+ say " 1. bin/rails db:migrate"
68
+ say ""
69
+ say "Configuration:", :yellow
70
+ say " - Set credentials: bin/rails credentials:edit"
71
+ say " backstage:"
72
+ say " username: your_user"
73
+ say " password: your_password"
74
+ say " - Or set ENV vars: #{options[:user_env_var]}, #{options[:password_env_var]}"
75
+ say ""
76
+ end
77
+
78
+ private
79
+
80
+ def rails_app?
81
+ File.exist?(File.join(destination_root, "bin/rails"))
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class BackstageController < ActionController::Base
4
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.configure do
4
+ config.solid_errors.connects_to = { database: { writing: :errors } }
5
+
6
+ backstage = Rails.application.credentials.backstage || {}
7
+
8
+ config.solid_errors.username = backstage[:username] || ENV.fetch("<%= options[:user_env_var] %>", nil)
9
+ config.solid_errors.password = backstage[:password] || ENV.fetch("<%= options[:password_env_var] %>", nil)
10
+ end
@@ -0,0 +1,3 @@
1
+ module MaquinaGenerators
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1 @@
1
+ require_relative "maquina_generators/version"
@@ -0,0 +1,187 @@
1
+ require "test_helper"
2
+ require "generators/maquina/clave/clave_generator"
3
+
4
+ class Maquina::Generators::ClaveGeneratorTest < Rails::Generators::TestCase
5
+ tests Maquina::Generators::ClaveGenerator
6
+ destination File.expand_path("../../tmp", __dir__)
7
+
8
+ setup do
9
+ prepare_destination
10
+
11
+ # Create a minimal Rails app structure
12
+ mkdir_p("app/controllers")
13
+ File.write(
14
+ File.join(destination_root, "app/controllers/application_controller.rb"),
15
+ "class ApplicationController < ActionController::Base\nend\n"
16
+ )
17
+
18
+ mkdir_p("config")
19
+ File.write(
20
+ File.join(destination_root, "config/routes.rb"),
21
+ "Rails.application.routes.draw do\nend\n"
22
+ )
23
+
24
+ File.write(
25
+ File.join(destination_root, "Gemfile"),
26
+ "source \"https://rubygems.org\"\n# gem \"bcrypt\"\n"
27
+ )
28
+ end
29
+
30
+ test "generates model files" do
31
+ run_generator
32
+
33
+ assert_file "app/models/current.rb", /class Current < ActiveSupport::CurrentAttributes/
34
+ assert_file "app/models/session.rb", /class Session < ApplicationRecord/
35
+ assert_file "app/models/email_verification.rb", /class EmailVerification < ApplicationRecord/
36
+ assert_file "app/models/user.rb", /class User < ApplicationRecord/
37
+ assert_file "app/models/user.rb", /has_secure_password/
38
+ end
39
+
40
+ test "generates controller files" do
41
+ run_generator
42
+
43
+ assert_file "app/controllers/concerns/authentication.rb", /module Authentication/
44
+ assert_file "app/controllers/sessions_controller.rb", /class SessionsController/
45
+ assert_file "app/controllers/session/verifications_controller.rb"
46
+ assert_file "app/controllers/session/verification_resends_controller.rb"
47
+ assert_file "app/controllers/registrations_controller.rb"
48
+ assert_file "app/controllers/registration/verifications_controller.rb"
49
+ assert_file "app/controllers/registration/verification_resends_controller.rb"
50
+ end
51
+
52
+ test "generates mailer" do
53
+ run_generator
54
+
55
+ assert_file "app/mailers/verification_mailer.rb", /class VerificationMailer/
56
+ end
57
+
58
+ test "generates helper" do
59
+ run_generator
60
+
61
+ assert_file "app/helpers/authentication_helper.rb", /module AuthenticationHelper/
62
+ assert_file "app/helpers/authentication_helper.rb", /def mask_email/
63
+ end
64
+
65
+ test "generates job" do
66
+ run_generator
67
+
68
+ assert_file "app/jobs/authentication_cleanup_job.rb", /class AuthenticationCleanupJob/
69
+ end
70
+
71
+ test "generates views" do
72
+ run_generator
73
+
74
+ assert_file "app/views/sessions/new.html.erb"
75
+ assert_file "app/views/session/verifications/new.html.erb"
76
+ assert_file "app/views/registrations/new.html.erb"
77
+ assert_file "app/views/registration/verifications/new.html.erb"
78
+ assert_file "app/views/verification_mailer/verification_code.html.erb"
79
+ assert_file "app/views/verification_mailer/verification_code.text.erb"
80
+ end
81
+
82
+ test "generates locale files" do
83
+ run_generator
84
+
85
+ assert_file "config/locales/clave.en.yml", /sessions/
86
+ assert_file "config/locales/clave.es.yml", /sessions/
87
+ end
88
+
89
+ test "generates test helper" do
90
+ run_generator
91
+
92
+ assert_file "test/test_helpers/session_test_helper.rb", /module SessionTestHelper/
93
+ end
94
+
95
+ test "injects authentication into application controller" do
96
+ run_generator
97
+
98
+ assert_file "app/controllers/application_controller.rb", /include Authentication/
99
+ end
100
+
101
+ test "adds routes" do
102
+ run_generator
103
+
104
+ assert_file "config/routes.rb", /resource :session/
105
+ assert_file "config/routes.rb", /resource :registration/
106
+ end
107
+
108
+ test "enables bcrypt" do
109
+ run_generator
110
+
111
+ assert_file "Gemfile", /^gem "bcrypt"/
112
+ end
113
+
114
+ test "generates migrations" do
115
+ run_generator
116
+
117
+ assert_migration "db/migrate/create_users.rb"
118
+ assert_migration "db/migrate/create_sessions.rb"
119
+ assert_migration "db/migrate/create_email_verifications.rb"
120
+ end
121
+
122
+ test "skips views with --skip-views" do
123
+ run_generator %w[--skip-views]
124
+
125
+ assert_no_file "app/views/sessions/new.html.erb"
126
+ assert_no_file "app/views/registrations/new.html.erb"
127
+ # Models should still be generated
128
+ assert_file "app/models/user.rb"
129
+ end
130
+
131
+ test "skips registration with --skip-registration" do
132
+ run_generator %w[--skip-registration]
133
+
134
+ assert_no_file "app/controllers/registrations_controller.rb"
135
+ assert_no_file "app/controllers/registration/verifications_controller.rb"
136
+ assert_no_file "app/controllers/registration/verification_resends_controller.rb"
137
+ assert_no_file "app/views/registrations/new.html.erb"
138
+ assert_no_file "app/views/registration/verifications/new.html.erb"
139
+
140
+ # Session should still be generated
141
+ assert_file "app/controllers/sessions_controller.rb"
142
+ assert_file "app/views/sessions/new.html.erb"
143
+
144
+ # Routes should not include registration
145
+ assert_file "config/routes.rb" do |routes|
146
+ assert_match(/resource :session/, routes)
147
+ assert_no_match(/resource :registration/, routes)
148
+ end
149
+ end
150
+
151
+ test "authentication concern uses root_url" do
152
+ run_generator
153
+
154
+ assert_file "app/controllers/concerns/authentication.rb", /root_url/
155
+ assert_file "app/controllers/concerns/authentication.rb" do |content|
156
+ assert_no_match(/dashboard_url/, content)
157
+ end
158
+ end
159
+
160
+ test "user model does not include resto-specific code" do
161
+ run_generator
162
+
163
+ assert_file "app/models/user.rb" do |content|
164
+ assert_no_match(/currency/, content)
165
+ assert_no_match(/timezone/, content)
166
+ assert_no_match(/settings/, content)
167
+ assert_no_match(/display_name/, content)
168
+ assert_no_match(/income_sources/, content)
169
+ assert_no_match(/transactions/, content)
170
+ end
171
+ end
172
+
173
+ test "views use indigo instead of resto colors" do
174
+ run_generator
175
+
176
+ assert_file "app/views/sessions/new.html.erb" do |content|
177
+ assert_match(/indigo/, content)
178
+ assert_no_match(/resto/, content)
179
+ end
180
+ end
181
+
182
+ private
183
+
184
+ def mkdir_p(path)
185
+ FileUtils.mkdir_p(File.join(destination_root, path))
186
+ end
187
+ end