Back to Repositories

Testing Devise Views Generator Implementation in heartcombo/devise

This test suite validates the Devise Views Generator functionality, ensuring proper creation and configuration of authentication view templates. It covers view generation with different scopes, form builders, and template engines while verifying the presence of shared components and error messages.

Test Coverage Overview

The test suite provides comprehensive coverage of the Devise Views Generator functionality.

  • Tests view generation with default settings and scoped configurations
  • Validates integration with different form builders (simple_form)
  • Verifies template engine variations (markerb support)
  • Ensures selective view generation for specific directories

Implementation Analysis

The testing approach utilizes Rails::Generators::TestCase as the foundation for generator testing.

Key implementation patterns include:
  • Modular test organization with helper methods for assertions
  • Consistent verification of file generation and content
  • Parameterized testing for different scopes and configurations

Technical Details

Testing infrastructure includes:

  • Rails Generator testing framework
  • File system assertions for view template verification
  • Custom assertion helpers for shared components
  • Temporary directory setup for isolation

Best Practices Demonstrated

The test suite exemplifies several testing best practices.

  • Comprehensive setup and teardown management
  • Reusable assertion methods for common verifications
  • Isolated test cases for different generator configurations
  • Clear separation of concerns in test organization

heartcombo/devise

test/generators/views_generator_test.rb

            
# frozen_string_literal: true

require "test_helper"

class ViewsGeneratorTest < Rails::Generators::TestCase
  tests Devise::Generators::ViewsGenerator
  destination File.expand_path("../../tmp", __FILE__)
  setup :prepare_destination

  test "Assert all views are properly created with no params" do
    run_generator
    assert_files
    assert_shared_links
    assert_error_messages
  end

  test "Assert all views are properly created with scope param" do
    run_generator %w(users)
    assert_files "users"
    assert_shared_links "users"
    assert_error_messages "users"

    run_generator %w(admins)
    assert_files "admins"
    assert_shared_links "admins"
    assert_error_messages "admins"
  end

  test "Assert views with simple form" do
    run_generator %w(-b simple_form_for)
    assert_files
    assert_file "app/views/devise/confirmations/new.html.erb", /simple_form_for/

    run_generator %w(users -b simple_form_for)
    assert_files "users"
    assert_file "app/views/users/confirmations/new.html.erb", /simple_form_for/
  end

  test "Assert views with markerb" do
    run_generator %w(--markerb)
    assert_files nil, mail_template_engine: "markerb"
  end


  test "Assert only views within specified directories" do
    run_generator %w(-v sessions registrations)
    assert_file "app/views/devise/sessions/new.html.erb"
    assert_file "app/views/devise/registrations/new.html.erb"
    assert_file "app/views/devise/registrations/edit.html.erb"
    assert_no_file "app/views/devise/confirmations/new.html.erb"
    assert_no_file "app/views/devise/mailer/confirmation_instructions.html.erb"
  end

  test "Assert mailer specific directory with simple form" do
    run_generator %w(-v mailer -b simple_form_for)
    assert_file "app/views/devise/mailer/confirmation_instructions.html.erb"
    assert_file "app/views/devise/mailer/reset_password_instructions.html.erb"
    assert_file "app/views/devise/mailer/unlock_instructions.html.erb"
  end

  test "Assert specified directories with scope" do
    run_generator %w(users -v sessions)
    assert_file "app/views/users/sessions/new.html.erb"
    assert_no_file "app/views/users/confirmations/new.html.erb"
  end

  test "Assert specified directories with simple form" do
    run_generator %w(-v registrations -b simple_form_for)
    assert_file "app/views/devise/registrations/new.html.erb", /simple_form_for/
    assert_no_file "app/views/devise/confirmations/new.html.erb"
    end

  test "Assert specified directories with markerb" do
    run_generator %w(--markerb -v passwords mailer)
    assert_file "app/views/devise/passwords/new.html.erb"
    assert_no_file "app/views/devise/confirmations/new.html.erb"
    assert_file "app/views/devise/mailer/reset_password_instructions.markerb"
  end

  def assert_files(scope = nil, options = {})
    scope = "devise" if scope.nil?
    mail_template_engine = options[:mail_template_engine] || "html.erb"

    assert_file "app/views/#{scope}/confirmations/new.html.erb"
    assert_file "app/views/#{scope}/mailer/confirmation_instructions.#{mail_template_engine}"
    assert_file "app/views/#{scope}/mailer/reset_password_instructions.#{mail_template_engine}"
    assert_file "app/views/#{scope}/mailer/unlock_instructions.#{mail_template_engine}"
    assert_file "app/views/#{scope}/passwords/edit.html.erb"
    assert_file "app/views/#{scope}/passwords/new.html.erb"
    assert_file "app/views/#{scope}/registrations/new.html.erb"
    assert_file "app/views/#{scope}/registrations/edit.html.erb"
    assert_file "app/views/#{scope}/sessions/new.html.erb"
    assert_file "app/views/#{scope}/shared/_links.html.erb"
    assert_file "app/views/#{scope}/shared/_error_messages.html.erb"
    assert_file "app/views/#{scope}/unlocks/new.html.erb"
  end

  def assert_shared_links(scope = nil)
    scope = "devise" if scope.nil?
    link = /<%= render \"#{scope}\/shared\/links\" %>/

    assert_file "app/views/#{scope}/passwords/edit.html.erb", link
    assert_file "app/views/#{scope}/passwords/new.html.erb", link
    assert_file "app/views/#{scope}/confirmations/new.html.erb", link
    assert_file "app/views/#{scope}/registrations/new.html.erb", link
    assert_file "app/views/#{scope}/sessions/new.html.erb", link
    assert_file "app/views/#{scope}/unlocks/new.html.erb", link
  end

  def assert_error_messages(scope = nil)
    scope = "devise" if scope.nil?
    link = /<%= render \"#{scope}\/shared\/error_messages\", resource: resource %>/

    assert_file "app/views/#{scope}/passwords/edit.html.erb", link
    assert_file "app/views/#{scope}/passwords/new.html.erb", link
    assert_file "app/views/#{scope}/confirmations/new.html.erb", link
    assert_file "app/views/#{scope}/registrations/new.html.erb", link
    assert_file "app/views/#{scope}/registrations/edit.html.erb", link
    assert_file "app/views/#{scope}/unlocks/new.html.erb", link
  end
end