require 'test_helper'
require 'generators/express_admin/install/install_generator'
require 'generators_test_helper'

class ExpressAdmin::Generators::InstallGeneratorTest < Rails::Generators::TestCase
  include GeneratorsTestHelper
  tests ExpressAdmin::Generators::InstallGenerator
  setup :copy_engine

  def test_install_on_invoke
    run_generator

    assert_file 'app/controllers/tmp/admin_controller.rb' do |content|
      assert_match /module Tmp/, content
      assert_match /class AdminController < ApplicationController/, content
      assert_match /before_filter :authenticate_user! if defined\?\(Devise\)/, content
      assert_match /layout "tmp\/admin"/, content
    end

    assert_file 'app/views/layouts/tmp/admin.html.et' do |content|
      assert_match /render\(template: 'layouts\/express_admin\/admin'\)/, content
    end

    assert_file 'lib/generators/tmp/install/install_generator.rb'
    assert_file 'lib/generators/tmp/install/USAGE'
    assert_directory 'lib/generators/tmp/install/templates'
    assert_file 'test/lib/generators/tmp/install/install_generator_test.rb'

    assert_file 'app/assets/javascripts/tmp/admin/application.js' do |content|
      assert_match /\/\/= require_tree \./, content
    end

    assert_file 'app/assets/stylesheets/tmp/admin/application.css' do |content|
      assert_match /\*= require express_admin/, content
    end

    assert_file 'config/menu.yml'

    assert_file 'lib/tmp/engine.rb' do |content|
      assert_match /require \'express_admin\'/, content
      assert_match /Tmp::Engine.config.tmp_mount_point = \'\/\'/, content
      assert_match /include ::ExpressAdmin::Menu::Loader/, content

      assert_match "initializer :assets do |config|", content
      assert_match "engine_assets_path = File.join(File.dirname(__FILE__), '..', '..', 'app', 'assets')", content
      assert_match "all_assets = Dir.glob File.join(engine_assets_path, 'stylesheets', '**', '*.css*')", content
      assert_match "all_assets += Dir.glob File.join(engine_assets_path, 'javascripts', '**', '*.js*')", content
      assert_match 'all_assets.each {|path| path.gsub!("#{engine_assets_path}/stylesheets/", \'\')}', content
      assert_match 'all_assets.each {|path| path.gsub!("#{engine_assets_path}/javascripts/", \'\')}', content
      assert_match "Rails.application.config.assets.precompile += all_assets", content
    end
  end

  def test_install_on_revoke
    run_generator [], behavior: :revoke

    assert_no_file 'app/controllers/tmp/admin_controller.rb'

    assert_no_file 'app/views/layouts/tmp/admin.html.et'

    assert_no_file 'lib/generators/tmp/install/install_generator.rb'
    assert_no_file 'lib/generators/tmp/install/USAGE'
    assert_no_directory 'lib/generators/tmp/install/templates'
    assert_no_file 'test/lib/generators/tmp/install/install_generator_test.rb'

    assert_no_file 'app/assets/javascripts/tmp/admin/application.js'

    assert_no_file 'app/assets/stylesheets/tmp/admin/application.css'

    assert_no_file 'config/menu.yml'
  end
end