require File.dirname(__FILE__) + '/../helper'
require 'thor/group'
require 'fakeweb'
require 'padrino-gen/generators/actions'
Dir[File.dirname(__FILE__) + '/generators/{components}/**/*.rb'].each { |lib| require lib }

class Person
  def self.properties
    [:id, :name, :age, :email].map { |c| OpenStruct.new(:name => c) }
  end
end

class TestAdminPageGenerator < Test::Unit::TestCase

  def setup
    `rm -rf /tmp/sample_project`
    @project = Padrino::Generators::Project.dup
    @admin   = Padrino::Generators::AdminApp.dup
    @page    = Padrino::Generators::AdminPage.dup
    @model   = Padrino::Generators::Model.dup
  end

  context 'the admin page generator' do

    should 'fail outside app root' do
      output = silence_logger { @page.start(['foo', '-r=/tmp/sample_project']) }
      assert_match(/not at the root/, output)
      assert_no_file_exists('/tmp/admin')
    end

    should 'fail without argument and model' do
      silence_logger { @project.start(['sample_project', '--root=/tmp', '-d=activerecord']) }
      silence_logger { @admin.start(['--root=/tmp/sample_project']) }
      assert_raise(Padrino::Admin::Generators::OrmError) { @page.start(['foo', '-r=/tmp/sample_project']) }
    end

    should 'correctyl generate a new padrino admin application default renderer' do
      'Person'.classify.constantize
      silence_logger { @project.start(['sample_project', '--root=/tmp', '-d=datamapper']) }
      silence_logger { @admin.start(['--root=/tmp/sample_project']) }
      silence_logger { @model.start(['person', "name:string", "age:integer", "email:string", '-root=/tmp/sample_project']) }
      silence_logger { @page.start(['person', '--root=/tmp/sample_project']) }
      assert_file_exists '/tmp/sample_project/admin/controllers/people.rb'
      assert_file_exists '/tmp/sample_project/admin/views/people/_form.haml'
      assert_file_exists '/tmp/sample_project/admin/views/people/edit.haml'
      assert_file_exists '/tmp/sample_project/admin/views/people/index.haml'
      assert_file_exists '/tmp/sample_project/admin/views/people/new.haml'
      %w(name age email).each do |field|
        assert_match_in_file "label :#{field}", '/tmp/sample_project/admin/views/people/_form.haml'
        assert_match_in_file "text_field :#{field}", '/tmp/sample_project/admin/views/people/_form.haml'
      end
      assert_match_in_file 'role.project_module :people, "/people"', '/tmp/sample_project/admin/app.rb'
    end

    should 'correctyl generate a new padrino admin application with erb renderer' do
      'Person'.classify.constantize
      silence_logger { @project.start(['sample_project', '--root=/tmp', '-d=datamapper', '-e=erb']) }
      silence_logger { @admin.start(['--root=/tmp/sample_project']) }
      silence_logger { @model.start(['person', "name:string", "age:integer", "email:string", '-root=/tmp/sample_project']) }
      silence_logger { @page.start(['person', '--root=/tmp/sample_project']) }
      assert_file_exists '/tmp/sample_project/admin/controllers/people.rb'
      assert_file_exists '/tmp/sample_project/admin/views/people/_form.erb'
      assert_file_exists '/tmp/sample_project/admin/views/people/edit.erb'
      assert_file_exists '/tmp/sample_project/admin/views/people/index.erb'
      assert_file_exists '/tmp/sample_project/admin/views/people/new.erb'
      %w(name age email).each do |field|
        assert_match_in_file "label :#{field}", '/tmp/sample_project/admin/views/people/_form.erb'
        assert_match_in_file "text_field :#{field}", '/tmp/sample_project/admin/views/people/_form.erb'
      end
      assert_match_in_file 'role.project_module :people, "/people"', '/tmp/sample_project/admin/app.rb'
    end
  end
end