diff --git a/.gitmodules b/.gitmodules index 844ff5c..3ee9458 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,6 @@ [submodule "extras/puppet"] path = extras/puppet url = git://github.com/ohadlevy/puppet-foreman.git +[submodule "vendor/plugins/has_many_polymorphs"] + path = vendor/plugins/has_many_polymorphs + url = git://github.com/fauna/has_many_polymorphs.git diff --git a/app/controllers/usergroups_controller.rb b/app/controllers/usergroups_controller.rb new file mode 100644 index 0000000..ed608b3 --- /dev/null +++ b/app/controllers/usergroups_controller.rb @@ -0,0 +1,45 @@ +class UsergroupsController < ApplicationController + def index + @usergroups = Usergroup.all + end + + def new + @usergroup = Usergroup.new + end + + def create + @usergroup = Usergroup.new(params[:usergroup]) + if @usergroup.save + flash[:foreman_notice] = "Successfully created usergroup." + redirect_to usergroups_path + else + render :action => 'new' + end + end + + def edit + @usergroup = Usergroup.find(params[:id]) + end + + def update + @usergroup = Usergroup.find(params[:id]) + + if @usergroup.update_attributes(params[:usergroup]) + flash[:foreman_notice] = "Successfully updated usergroup." + redirect_to usergroups_path + else + render :action => 'edit' + end + end + + def destroy + @usergroup = Usergroup.find(params[:id]) + if @usergroup.destroy + flash[:foreman_notice] = "Successfully destroyed usergroup." + else + logger.error @usergroup.errors.full_messages + flash[:foreman_error] = @usergroup.errors.full_messages.join "
" + end + redirect_to usergroups_path + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2118d97..7f38304 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -10,9 +10,11 @@ class UsersController < ApplicationController columns[:firstname].label = "First name" columns[:lastname].label = "Surname" columns[:admin].label = "Admin" - config.columns = [:firstname, :lastname, :login, :mail, :admin, :auth_source, :last_login_on] + config.columns = [:firstname, :lastname, :login, :mail, :admin, :auth_source, :usergroups, :last_login_on] + config.update.columns = [:firstname, :lastname, :login, :mail, :admin, :auth_source, :last_login_on] config.columns[:auth_source].form_ui = :select config.columns[:admin].form_ui = :checkbox + config.columns[:usergroups].clear_link list.sorting = {:last_login_on => 'DESC' } config.update.columns.exclude :last_login_on end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 368f489..f37cf99 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -10,7 +10,7 @@ module ApplicationHelper end def edit_habtm klass, association - render :partial => 'common/edit_habtm', :locals =>{ :klass => klass, :associations => association.all} + render :partial => 'common/edit_habtm', :locals =>{ :klass => klass, :associations => association.all.delete_if{|e| e == klass}} end def link_to_remove_fields(name, f) diff --git a/app/helpers/usergroups_helper.rb b/app/helpers/usergroups_helper.rb new file mode 100644 index 0000000..1764f18 --- /dev/null +++ b/app/helpers/usergroups_helper.rb @@ -0,0 +1,2 @@ +module UsergroupsHelper +end diff --git a/app/models/host.rb b/app/models/host.rb index c14f77e..ce90a83 100644 --- a/app/models/host.rb +++ b/app/models/host.rb @@ -12,6 +12,7 @@ class Host < Puppet::Rails::Host has_many :reports, :dependent => :destroy has_many :host_parameters, :dependent => :destroy accepts_nested_attributes_for :host_parameters, :reject_if => lambda { |a| a[:value].blank? }, :allow_destroy => true + belongs_to :owner, :polymorphic => true named_scope :recent, lambda { |*args| {:conditions => ["last_report > ?", (args.first || (SETTINGS[:run_interval] + 5.minutes).ago)]} } named_scope :out_of_sync, lambda { |*args| {:conditions => ["last_report < ?", (args.first || (SETTINGS[:run_interval] + 5.minutes).ago)]} } @@ -80,6 +81,10 @@ class Host < Puppet::Rails::Host before_validation :normalize_addresses, :normalize_hostname + def <=>(other) + self.name <=> other.name + end + # Returns the name of this host as a string # String: the host's name def to_label @@ -99,6 +104,21 @@ class Host < Puppet::Rails::Host 20 end + # method to return the correct owner list for host edit owner select dropbox + def is_owned_by + owner.id_and_type if owner + end + + # virtual attributes which sets the owner based on the user selection + # supports a simple user, or a usergroup + # selection parameter is expected to be an ActiveRecord id_and_type method (see Foreman's AR extentions). + def is_owned_by=(selection) + oid = nil + oid = User.find(selection.to_i) if selection =~ /-Users$/ + oid = Usergroup.find(selection.to_i) if selection =~ /-Usergroups$/ + self.owner = oid + end + def clearReports # Remove any reports that may be held against this host Report.delete_all("host_id = #{self.id}") diff --git a/app/models/host_mailer.rb b/app/models/host_mailer.rb index 349e260..8dd19ce 100644 --- a/app/models/host_mailer.rb +++ b/app/models/host_mailer.rb @@ -44,7 +44,8 @@ class HostMailer < ActionMailer::Base def error_state(report) host = report.host - email = SETTINGS[:administrator] + email = host.owner.recipients if SETTINGS[:ldap] and not host.owner.empty? + email ||= SETTINGS[:administrator] raise "unable to find recipients" if email.empty? recipients email from "Foreman-noreply" diff --git a/app/models/user.rb b/app/models/user.rb index 8dfc90e..0911182 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,8 +1,8 @@ class User < ActiveRecord::Base belongs_to :auth_source has_many :changes, :class_name => 'Audit', :as => :user - - has_many :hosts + has_many :usergroups, :through => :usergroup_member + has_many :direct_hosts, :as => :owner, :class_name => "Host" validates_uniqueness_of :login, :message => "already exists" validates_presence_of :login, :mail @@ -13,9 +13,22 @@ class User < ActiveRecord::Base validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :allow_nil => true validates_length_of :mail, :maximum => 60, :allow_nil => true + before_destroy Ensure_not_used_by.new(:hosts) + def to_label "#{firstname} #{lastname}" end + alias_method :to_s, :to_label + alias_method :name, :to_label + + def <=>(other) + self.name <=> other.name + end + + # The text item to see in a select dropdown menu + def select_title + name + " (#{login})" + end def self.try_to_login(login, password) # Make sure no one can sign in with an empty password @@ -49,4 +62,28 @@ class User < ActiveRecord::Base raise text end + def indirect_hosts + all_groups = [] + for usergroup in usergroups + all_groups += usergroup.all_usergroups + end + all_groups.uniq.map{|g| g.hosts}.flatten.uniq + end + + def hosts + direct_hosts + indirect_hosts + end + + def recipients + [mail] + end + + protected + + def validate + if Usergroup.all.map(&:name).include?(self.login) + errors.add_to_base "A usergroup already exists with this name" + end + end + end diff --git a/app/models/usergroup.rb b/app/models/usergroup.rb new file mode 100644 index 0000000..81c54c2 --- /dev/null +++ b/app/models/usergroup.rb @@ -0,0 +1,62 @@ +class Usergroup < ActiveRecord::Base + has_many_polymorphs :members, :from => [:usergroups, :users ], :as => :member, + :through => :usergroup_member, :foreign_key => :usergroup_id, :dependent => :destroy + + has_many :hosts, :as => :owner + validates_uniqueness_of :name + before_destroy Ensure_not_used_by.new(:hosts, :usergroups) + + def to_s + name + end + + # The text item to see in a select dropdown menu + alias_method :select_title, :to_s + + # Support for sorting the groups by name + def <=>(other) + self.name <=> other.name + end + + # This methods retrieves all user addresses in a usergroup + # Returns: Array of strings representing the user's email addresses + def recipients + all_users.map(&:mail) + end + + # This methods retrieves all users in a usergroup + # Returns: Array of users + def all_users(group_list=[self], user_list=[]) + retrieve_users_and_groups group_list, user_list + user_list.sort.uniq + end + + # This methods retrieves all usergroups in a usergroup + # Returns: Array of usergroups + def all_usergroups(group_list=[self], user_list=[]) + retrieve_users_and_groups group_list, user_list + group_list.sort.uniq + end + + protected + # Recurses down the tree of usergroups and finds the users + # [+group_list+]: Array of Usergroups that have already been processed + # [+users+] : Array of users accumulated at this point + # Returns : Array of non unique users + def retrieve_users_and_groups(group_list, user_list) + for group in usergroups + next if group_list.include? group + group_list << group + + group.retrieve_users_and_groups(group_list, user_list) + end + user_list.concat users + end + + def validate + if User.all.map(&:login).include?(self.name) + errors.add :name, "is already used by a user account" + end + end + +end diff --git a/app/models/usergroup_member.rb b/app/models/usergroup_member.rb new file mode 100644 index 0000000..6fea6dd --- /dev/null +++ b/app/models/usergroup_member.rb @@ -0,0 +1,5 @@ +class UsergroupMember < ActiveRecord::Base + belongs_to :member, :polymorphic => true + belongs_to :usergroup + +end diff --git a/app/views/home/settings.erb b/app/views/home/settings.erb index 2450791..9370725 100644 --- a/app/views/home/settings.erb +++ b/app/views/home/settings.erb @@ -12,6 +12,7 @@
  • <%= link_to 'Global Parameters', common_parameters_path %>
  • <%= link_to "External Variables", lookup_keys_path %>
  • <%= link_to 'LDAP Authentication', auth_source_ldaps_path %>
  • -
  • <%= link_to_if SETTINGS[:ldap], 'Users', users_path %>
  • +
  • <%= link_to_if SETTINGS[:ldap], 'Users', users_path %>
  • +
  • <%= link_to_if SETTINGS[:ldap], 'Usergroups', usergroups_path %>
  • diff --git a/app/views/hosts/_form.html.erb b/app/views/hosts/_form.html.erb index 3243409..bea7c05 100644 --- a/app/views/hosts/_form.html.erb +++ b/app/views/hosts/_form.html.erb @@ -13,6 +13,14 @@ Puppetmaster <%= f.text_field :puppetmaster, :size => 10, :value => @host.puppetmaster %> <%= link_to_function "Additional Classes", toggle_div(:classlist) %> + <% if SETTINGS[:ldap] -%> + Owned by + + <%= f.select :is_owned_by, + option_groups_from_collection_for_select( [ User, Usergroup], :all, :table_name, :id_and_type, :select_title, @host.is_owned_by), + :include_blank => "select an owner" %> + + <% end -%> diff --git a/app/views/usergroups/_form.html.erb b/app/views/usergroups/_form.html.erb new file mode 100644 index 0000000..b01f7a3 --- /dev/null +++ b/app/views/usergroups/_form.html.erb @@ -0,0 +1,18 @@ +<% form_for @usergroup do |f| %> + <%= f.error_messages %> + + + + + + + + + + + + + + +
    Name<%= f.text_field :name %>
    User groups<%= edit_habtm @usergroup, Usergroup %>
    Users<%= edit_habtm @usergroup, User %>
    <%= f.submit "Submit" %>
    +<% end %> diff --git a/app/views/usergroups/edit.html.erb b/app/views/usergroups/edit.html.erb new file mode 100644 index 0000000..2726e33 --- /dev/null +++ b/app/views/usergroups/edit.html.erb @@ -0,0 +1,7 @@ +<% title "Edit Usergroup" %> + +<%= render :partial => 'form' %> + +

    + <%= link_to "View All", usergroups_path %> +

    diff --git a/app/views/usergroups/index.html.erb b/app/views/usergroups/index.html.erb new file mode 100644 index 0000000..e0439fa --- /dev/null +++ b/app/views/usergroups/index.html.erb @@ -0,0 +1,22 @@ +<% title "Usergroups" %> + + + + + + + + + <% for usergroup in @usergroups %> + "> + + + + + + <% end %> +
    NameUsersUser Groups
    <%= link_to h(usergroup.name), edit_usergroup_path(usergroup) %><%= usergroup.users.map(&:login).to_sentence %><%= usergroup.usergroups.map(&:name).to_sentence %> + <%= link_to "Destroy", usergroup, :confirm => 'Are you sure?', :method => :delete %> +
    + +

    <%= link_to "New Usergroup", new_usergroup_path %>

    diff --git a/app/views/usergroups/new.html.erb b/app/views/usergroups/new.html.erb new file mode 100644 index 0000000..9d3465d --- /dev/null +++ b/app/views/usergroups/new.html.erb @@ -0,0 +1,5 @@ +<% title "New Usergroup" %> + +<%= render :partial => 'form' %> + +

    <%= link_to "Back to List", usergroups_path %>

    diff --git a/app/views/usergroups/update.html.erb b/app/views/usergroups/update.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/config/initializers/foreman.rb b/config/initializers/foreman.rb index 7f37ca7..709a9fd 100644 --- a/config/initializers/foreman.rb +++ b/config/initializers/foreman.rb @@ -48,6 +48,11 @@ class ActiveRecord::Base end end end + + def id_and_type + "#{id}-#{self.class.table_name.humanize}" + end + end module ExemptedFromLogging diff --git a/config/routes.rb b/config/routes.rb index b24dbd7..90e1240 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ ActionController::Routing::Routes.draw do |map| + map.resources :usergroups map.root :controller => "hosts" map.connect "node/:name", :controller => 'hosts', :action => 'externalNodes', diff --git a/db/migrate/20100416124600_create_usergroups.rb b/db/migrate/20100416124600_create_usergroups.rb new file mode 100644 index 0000000..1cca3db --- /dev/null +++ b/db/migrate/20100416124600_create_usergroups.rb @@ -0,0 +1,17 @@ +class CreateUsergroups < ActiveRecord::Migration + def self.up + create_table :usergroups do |t| + t.string :name + t.timestamps + end + create_table :usergroup_members do |t| + t.references :member, :polymorphic => true + t.references :usergroup + end + end + + def self.down + drop_table :members + drop_table :usergroups + end +end diff --git a/db/migrate/20100419151910_add_owner_to_hosts.rb b/db/migrate/20100419151910_add_owner_to_hosts.rb new file mode 100644 index 0000000..4b7e41f --- /dev/null +++ b/db/migrate/20100419151910_add_owner_to_hosts.rb @@ -0,0 +1,18 @@ +class AddOwnerToHosts < ActiveRecord::Migration + def self.up + add_column :hosts, :owner_id, :integer + add_column :hosts, :owner_type, :string + + Host.reset_column_information + + updated = [] + owner = User.find_or_create_by_login(:login => "admin", :admin => true, :firstname => "Admin", :lastname => "User", :mail => "root@" + Facter.domain) + say "setting default owner for all hosts" + Host.update_all("owner_id = '#{owner.id}'") + end + + def self.down + remove_column :hosts, :owner_type + remove_column :hosts, :owner_id + end +end diff --git a/test/fixtures/usergroups.yml b/test/fixtures/usergroups.yml new file mode 100644 index 0000000..157d747 --- /dev/null +++ b/test/fixtures/usergroups.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index ee59daa..86a4b60 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,18 +1,18 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html one: - login: MyString - firstname: MyString - lastname: MyString + login: one + firstname: One + lastname: User mail: MyString admin: false last_login_on: 2009-10-12 21:50:04 auth_source_id: 1 two: - login: MyString - firstname: MyString - lastname: MyString + login: two + firstname: Two + lastname: User mail: MyString admin: false last_login_on: 2009-10-12 21:50:04 diff --git a/test/functional/architectures_controller_test.rb b/test/functional/architectures_controller_test.rb index 511c4bb..b82b9cc 100644 --- a/test/functional/architectures_controller_test.rb +++ b/test/functional/architectures_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class ArchitecturesControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Architecture.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Architecture.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to architectures_url end def test_edit - get :edit, :id => Architecture.first + get :edit, {:id => Architecture.first}, set_session_user assert_template 'edit' end def test_update_invalid Architecture.any_instance.stubs(:valid?).returns(false) - put :update, :id => Architecture.first + put :update, {:id => Architecture.first}, set_session_user assert_template 'edit' end def test_update_valid Architecture.any_instance.stubs(:valid?).returns(true) - put :update, :id => Architecture.first + put :update, {:id => Architecture.first}, set_session_user assert_redirected_to architectures_url end def test_destroy architecture = Architecture.first - delete :destroy, :id => architecture + delete :destroy, {:id => architecture}, set_session_user assert_redirected_to architectures_url assert !Architecture.exists?(architecture.id) end diff --git a/test/functional/audit_controller_test.rb b/test/functional/audit_controller_test.rb index 7e508b0..ea4aaee 100644 --- a/test/functional/audit_controller_test.rb +++ b/test/functional/audit_controller_test.rb @@ -2,13 +2,13 @@ require 'test_helper' class AuditControllerTest < ActionController::TestCase test "should get index" do - get :index + get :index, {}, set_session_user assert_response :success assert_not_nil assigns(:records) end test "should get search" do - get :show_search + get :show_search, {}, set_session_user assert_response :success end @@ -19,7 +19,7 @@ class AuditControllerTest < ActionController::TestCase audited_record = Audit.find_by_auditable_id(parameter.id) assert_not_nil audited_record - get :show, :id => audited_record.id + get :show, {:id => audited_record.id}, set_session_user assert_response :success end end diff --git a/test/functional/auth_source_ldaps_controller_test.rb b/test/functional/auth_source_ldaps_controller_test.rb index e3f9997..2833558 100644 --- a/test/functional/auth_source_ldaps_controller_test.rb +++ b/test/functional/auth_source_ldaps_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class AuthSourceLdapsControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid AuthSourceLdap.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid AuthSourceLdap.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to auth_source_ldaps_url end def test_edit - get :edit, :id => AuthSourceLdap.first + get :edit, {:id => AuthSourceLdap.first}, set_session_user assert_template 'edit' end def test_update_invalid AuthSourceLdap.any_instance.stubs(:valid?).returns(false) - put :update, :id => AuthSourceLdap.first + put :update, {:id => AuthSourceLdap.first}, set_session_user assert_template 'edit' end def test_update_valid AuthSourceLdap.any_instance.stubs(:valid?).returns(true) - put :update, :id => AuthSourceLdap.first + put :update, {:id => AuthSourceLdap.first}, set_session_user assert_redirected_to auth_source_ldaps_url end def test_destroy auth_source_ldap = AuthSourceLdap.first - delete :destroy, :id => auth_source_ldap + delete :destroy, {:id => auth_source_ldap}, set_session_user assert_redirected_to auth_source_ldaps_url assert !AuthSourceLdap.exists?(auth_source_ldap.id) end diff --git a/test/functional/common_parameters_controller_test.rb b/test/functional/common_parameters_controller_test.rb index e566539..a3c9c89 100644 --- a/test/functional/common_parameters_controller_test.rb +++ b/test/functional/common_parameters_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class CommonParametersControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid CommonParameter.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid CommonParameter.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to common_parameters_url end def test_edit - get :edit, :id => CommonParameter.first + get :edit, {:id => CommonParameter.first}, set_session_user assert_template 'edit' end def test_update_invalid CommonParameter.any_instance.stubs(:valid?).returns(false) - put :update, :id => CommonParameter.first + put :update, {:id => CommonParameter.first}, set_session_user assert_template 'edit' end def test_update_valid CommonParameter.any_instance.stubs(:valid?).returns(true) - put :update, :id => CommonParameter.first + put :update, {:id => CommonParameter.first}, set_session_user assert_redirected_to common_parameters_url end def test_destroy common_parameter = CommonParameter.first - delete :destroy, :id => common_parameter + delete :destroy, {:id => common_parameter}, set_session_user assert_redirected_to common_parameters_url assert !CommonParameter.exists?(common_parameter.id) end diff --git a/test/functional/dashboard_controller_test.rb b/test/functional/dashboard_controller_test.rb index 9b2afd4..260b661 100644 --- a/test/functional/dashboard_controller_test.rb +++ b/test/functional/dashboard_controller_test.rb @@ -2,24 +2,24 @@ require 'test_helper' class DashboardControllerTest < ActionController::TestCase test "should get index" do - get :index + get :index, {}, set_session_user assert_response :success end test "should get errors" do - get :errors + get :errors, {}, set_session_user assert_response :success assert_template :partial => "hosts/_minilist" end test "should get active" do - get :active + get :active, {}, set_session_user assert_response :success assert_template :partial => "hosts/_minilist" end test "should get out of sync" do - get :OutOfSync + get :OutOfSync, {}, set_session_user assert_response :success assert_template :partial => "hosts/_minilist" end diff --git a/test/functional/domains_controller_test.rb b/test/functional/domains_controller_test.rb index e5931f1..ad70109 100644 --- a/test/functional/domains_controller_test.rb +++ b/test/functional/domains_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class DomainsControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Domain.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Domain.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to domains_url end def test_edit - get :edit, :id => Domain.first + get :edit, {:id => Domain.first}, set_session_user assert_template 'edit' end def test_update_invalid Domain.any_instance.stubs(:valid?).returns(false) - put :update, :id => Domain.first + put :update, {:id => Domain.first}, set_session_user assert_template 'edit' end def test_update_valid Domain.any_instance.stubs(:valid?).returns(true) - put :update, :id => Domain.first + put :update, {:id => Domain.first}, set_session_user assert_redirected_to domains_url end def test_destroy domain = Domain.first - delete :destroy, :id => domain + delete :destroy, {:id => domain}, set_session_user assert_redirected_to domains_url assert !Domain.exists?(domain.id) end diff --git a/test/functional/environments_controller_test.rb b/test/functional/environments_controller_test.rb index f401f99..1e9fe62 100644 --- a/test/functional/environments_controller_test.rb +++ b/test/functional/environments_controller_test.rb @@ -7,19 +7,19 @@ class EnvironmentsControllerTest < ActionController::TestCase end test "should get index" do - get :index + get :index, {}, set_session_user assert_response :success assert_not_nil assigns(:records) end - test "shuold get new" do - get :new + test "should get new" do + get :new, {}, set_session_user assert_response :success end test "should create new environment" do assert_difference 'Environment.count' do - post :create, { :commit => "Create", :record => {:name => "some_environment"} } + post :create, { :commit => "Create", :record => {:name => "some_environment"} }, set_session_user end assert_redirected_to environments_path @@ -29,7 +29,7 @@ class EnvironmentsControllerTest < ActionController::TestCase environment = Environment.new :name => "some_environment" assert environment.save! - get :edit, :id => environment.id + get :edit, {:id => environment.id}, set_session_user assert_response :success end @@ -37,7 +37,7 @@ class EnvironmentsControllerTest < ActionController::TestCase environment = Environment.new :name => "some_environment" assert environment.save! - put :update, { :commit => "Update", :id => environment.id, :record => {:name => "other_environment"} } + put :update, { :commit => "Update", :id => environment.id, :record => {:name => "other_environment"} }, set_session_user environment = Environment.find_by_id(environment.id) assert environment.name == "other_environment" @@ -49,7 +49,7 @@ class EnvironmentsControllerTest < ActionController::TestCase assert environment.save! assert_difference('Environment.count', -1) do - delete :destroy, :id => environment.id + delete :destroy, {:id => environment.id}, set_session_user end assert_redirected_to environments_path diff --git a/test/functional/fact_values_controller_test.rb b/test/functional/fact_values_controller_test.rb index d0a1819..03f93b5 100644 --- a/test/functional/fact_values_controller_test.rb +++ b/test/functional/fact_values_controller_test.rb @@ -2,13 +2,13 @@ require 'test_helper' class FactValuesControllerTest < ActionController::TestCase test "should get list" do - get :list + get :list, {}, set_session_user assert_response :success assert_not_nil :records end test "should get list_filter" do - get :list_filter + get :list_filter, {}, set_session_user assert_response :found end end diff --git a/test/functional/home_controller_test.rb b/test/functional/home_controller_test.rb index 7c71fd0..4dd484f 100644 --- a/test/functional/home_controller_test.rb +++ b/test/functional/home_controller_test.rb @@ -2,7 +2,7 @@ require 'test_helper' class HomeControllerTest < ActionController::TestCase test "should get settings" do - get :settings + get :settings, {}, set_session_user assert_response :success end end diff --git a/test/functional/hostgroups_controller_test.rb b/test/functional/hostgroups_controller_test.rb index 9bd2b1d..4be39b1 100644 --- a/test/functional/hostgroups_controller_test.rb +++ b/test/functional/hostgroups_controller_test.rb @@ -2,48 +2,48 @@ require 'test_helper' class HostgroupsControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Hostgroup.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Hostgroup.any_instance.stubs(:valid?).returns(true) pc = Puppetclass.first - post :create, "hostgroup" => {"name"=>"test_it", "group_parameters_attributes"=>{"1272344174448"=>{"name"=>"x", "value"=>"y", "_destroy"=>""}}, "puppetclass_ids"=>["", pc.id.to_s]} + post :create, {"hostgroup" => {"name"=>"test_it", "group_parameters_attributes"=>{"1272344174448"=>{"name"=>"x", "value"=>"y", "_destroy"=>""}}, "puppetclass_ids"=>["", pc.id.to_s]}}, set_session_user assert_redirected_to hostgroups_url end def test_edit - get :edit, :id => Hostgroup.first + get :edit, {:id => Hostgroup.first}, set_session_user assert_template 'edit' end def test_update_invalid Hostgroup.any_instance.stubs(:valid?).returns(false) - put :update, :id => Hostgroup.first + put :update, {:id => Hostgroup.first}, set_session_user assert_template 'edit' end def test_update_valid Hostgroup.any_instance.stubs(:valid?).returns(true) - put :update, :id => Hostgroup.first + put :update, {:id => Hostgroup.first}, set_session_user assert_redirected_to hostgroups_url end def test_destroy hostgroup = Hostgroup.first - delete :destroy, :id => hostgroup + delete :destroy, {:id => hostgroup}, set_session_user assert_redirected_to hostgroups_url assert !Hostgroup.exists?(hostgroup.id) end diff --git a/test/functional/hosts_controller_test.rb b/test/functional/hosts_controller_test.rb index 63c783e..391dfd7 100644 --- a/test/functional/hosts_controller_test.rb +++ b/test/functional/hosts_controller_test.rb @@ -3,76 +3,102 @@ require 'test_helper' class HostsControllerTest < ActionController::TestCase setup :initialize_host - def test_index - get :index - assert_template 'index' - end - def test_show - get :show, :id => Host.first + get :show, {:id => Host.first}, set_session_user assert_template 'show' end - def test_new - get :new - assert_template 'new' - end - def test_create_invalid Host.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Host.any_instance.stubs(:valid?).returns(true) - post :create, :host => {:name => "test"} - assert_redirected_to host_url(assigns(:host)) + post :create, {:host => {:name => "test"}}, set_session_user + assert_redirected_to host_url(assigns('host')) end - def test_edit - get :edit, :id => Host.first + test "should get index" do + get :index, {}, set_session_user + assert_response :success + assert_template 'index' + end + + test "should get new" do + get :new, {}, set_session_user + assert_response :success + assert_template 'new' + end + + test "should create new host" do + assert_difference 'Host.count' do + post :create, { :commit => "Create", + :host => {:name => "myotherfullhost", + :mac => "aabbecddee00", + :ip => "123.05.02.25", + :domain => Domain.find_or_create_by_name("othercompany.com"), + :operatingsystem => Operatingsystem.first, + :architecture => Architecture.first, + :environment => Environment.first, + :disk => "empty partition" + } + }, set_session_user + end + end + + test "should get edit" do + get :edit, {:id => @host.id}, set_session_user + assert_response :success assert_template 'edit' end + test "should update host" do + put :update, { :commit => "Update", :id => @host.id, :host => {:disk => "ntfs"} }, set_session_user + @host = Host.find_by_id(@host.id) + assert_equal @host.disk, "ntfs" + end + def test_update_invalid Host.any_instance.stubs(:valid?).returns(false) - put :update, :id => Host.first + put :update, {:id => Host.first}, set_session_user assert_template 'edit' end def test_update_valid Host.any_instance.stubs(:valid?).returns(true) - put :update, :id => Host.first + put :update, {:id => Host.first}, set_session_user assert_redirected_to host_url(assigns(:host)) end def test_destroy host = Host.first - delete :destroy, :id => host + delete :destroy, {:id => host}, set_session_user assert_redirected_to hosts_url assert !Host.exists?(host.id) end -test "externalNodes should render 404 when no params are given" do - get :externalNodes + + test "externalNodes should render 404 when no params are given" do + get :externalNodes, {}, set_session_user assert_response :missing assert_template :text => '404 Not Found' end test "externalNodes should render correctly when id is given" do - get :externalNodes, :id => @host.id + get :externalNodes, {:id => @host.id}, set_session_user assert_response :success assert_template :text => @host.info.to_yaml.gsub("\n","
    ") end test "externalNodes should render correctly when name is given" do - get :externalNodes, :name => @host.name + get :externalNodes, {:name => @host.name}, set_session_user assert_response :success assert_template :text => @host.info.to_yaml.gsub("\n","
    ") end test "externalNodes should render yml request correctly" do - get :externalNodes, :id => @host.id, :format => "yml" + get :externalNodes, {:id => @host.id, :format => "yml"}, set_session_user assert_response :success assert_template :text => @host.info.to_yaml end @@ -82,7 +108,7 @@ test "externalNodes should render 404 when no params are given" do mock(Host).find(@host.id.to_s) {@host} @request.env['HTTP_REFERER'] = hosts_path - get :setBuild, {:id => @host.id} + get :setBuild, {:id => @host.id}, set_session_user assert_response :found assert_redirected_to hosts_path assert_not_nil flash[:foreman_notice] @@ -94,7 +120,7 @@ test "externalNodes should render 404 when no params are given" do mock(Host).find(@host.id.to_s) {@host} @request.env['HTTP_REFERER'] = hosts_path - get :setBuild, :id => @host.id + get :setBuild, {:id => @host.id}, set_session_user assert_response :found assert_redirected_to hosts_path assert_not_nil flash[:foreman_error] @@ -102,7 +128,7 @@ test "externalNodes should render 404 when no params are given" do end test "rrdreport should print error message if host has no last_report" do - get :rrdreport, :id => @host.id + get :rrdreport, {:id => @host.id}, set_session_user assert_response :success assert_template :text => "Sorry, no graphs for this host" end @@ -112,19 +138,19 @@ test "externalNodes should render 404 when no params are given" do assert @host.save! SETTINGS[:rrd_report_url] = "/some/url" - get :rrdreport, :id => @host.id + get :rrdreport, {:id => @host.id}, set_session_user assert_response :success assert_template :partial => "_rrdreport" end test "report should redirect to host's last report" do - get :report, :id => @host.id + get :report, {:id => @host.id}, set_session_user assert_response :found assert_redirected_to :controller => "reports", :action => "show", :id => @host.id end test "query in .yml format should return host.to_yml" do - get :query, :format => "yml" + get :query, {:format => "yml"}, set_session_user assert_template :text => @host.to_yaml end diff --git a/test/functional/lookup_keys_controller_test.rb b/test/functional/lookup_keys_controller_test.rb index c4ee06a..ffed67a 100644 --- a/test/functional/lookup_keys_controller_test.rb +++ b/test/functional/lookup_keys_controller_test.rb @@ -2,37 +2,41 @@ require 'test_helper' class LookupKeysControllerTest < ActionController::TestCase test "should get index" do - get :index + get :index, {}, set_session_user assert_response :success assert_not_nil assigns(:lookup_key) end test "should get new" do - get :new + get :new, {}, set_session_user assert_response :success end test "should create lookup_keys" do assert_difference('LookupKey.count') do - post :create, :lookup_key=>{"lookup_values_attributes"=>{"0"=>{"priority"=>"1", "value"=>"x", "_destroy"=>""}, "1"=>{"priority"=>"2", "value"=>"y", "_destroy"=>""}}, "key"=>"tests"} + post :create, {:lookup_key=>{"lookup_values_attributes"=>{"0"=>{"priority"=>"1", "value"=>"x", "_destroy"=>""}, + "1"=>{"priority"=>"2", "value"=>"y", "_destroy"=>""}}, + "key"=>"tests"} + }, + set_session_user end assert_redirected_to lookup_keys_path(assigns(:lookup_keys)) end test "should get edit" do - get :edit, :id => lookup_keys(:one).to_param + get :edit, {:id => lookup_keys(:one).to_param}, set_session_user assert_response :success end test "should update lookup_keys" do - put :update, :id => lookup_keys(:one).to_param, :lookup_key => { :key => "test that" } + put :update, {:id => lookup_keys(:one).to_param, :lookup_key => { :key => "test that" }}, set_session_user assert_redirected_to lookup_keys_path(assigns(:lookup_keys)) end test "should destroy lookup_keys" do assert_difference('LookupKey.count', -1) do - delete :destroy, :id => lookup_keys(:one).to_param + delete :destroy, {:id => lookup_keys(:one).to_param}, set_session_user end assert_redirected_to lookup_keys_path diff --git a/test/functional/medias_controller_test.rb b/test/functional/medias_controller_test.rb index 343e13c..04ff7ae 100644 --- a/test/functional/medias_controller_test.rb +++ b/test/functional/medias_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class MediasControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Media.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Media.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to medias_url end def test_edit - get :edit, :id => Media.first + get :edit, {:id => Media.first}, set_session_user assert_template 'edit' end def test_update_invalid Media.any_instance.stubs(:valid?).returns(false) - put :update, :id => Media.first + put :update, {:id => Media.first}, set_session_user assert_template 'edit' end def test_update_valid Media.any_instance.stubs(:valid?).returns(true) - put :update, :id => Media.first + put :update, {:id => Media.first}, set_session_user assert_redirected_to medias_url end def test_destroy media = Media.first - delete :destroy, :id => media + delete :destroy, {:id => media}, set_session_user assert_redirected_to medias_url assert !Media.exists?(media.id) end diff --git a/test/functional/models_controller_test.rb b/test/functional/models_controller_test.rb index f478ba9..e15effd 100644 --- a/test/functional/models_controller_test.rb +++ b/test/functional/models_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class ModelsControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Model.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Model.any_instance.stubs(:valid?).returns(true) - post :create, :model => {:name => "test"} + post :create, {:model => {:name => "test"}}, set_session_user assert_redirected_to models_url end def test_edit - get :edit, :id => Model.first + get :edit, {:id => Model.first}, set_session_user assert_template 'edit' end def test_update_invalid Model.any_instance.stubs(:valid?).returns(false) - put :update, :id => Model.first + put :update, {:id => Model.first}, set_session_user assert_template 'edit' end def test_update_valid Model.any_instance.stubs(:valid?).returns(true) - put :update, :id => Model.first + put :update, {:id => Model.first}, set_session_user assert_redirected_to models_url end def test_destroy model = Model.first - delete :destroy, :id => model + delete :destroy, {:id => model}, set_session_user assert_redirected_to models_url assert !Model.exists?(model.id) end diff --git a/test/functional/operatingsystems_controller_test.rb b/test/functional/operatingsystems_controller_test.rb index db82ef7..c16ac8a 100644 --- a/test/functional/operatingsystems_controller_test.rb +++ b/test/functional/operatingsystems_controller_test.rb @@ -2,46 +2,46 @@ require 'test_helper' class OperatingsystemsControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Operatingsystem.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Operatingsystem.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to operatingsystems_url end def test_edit - get :edit, :id => Operatingsystem.first + get :edit, {:id => Operatingsystem.first}, set_session_user assert_template 'edit' end def test_update_invalid Operatingsystem.any_instance.stubs(:valid?).returns(false) - put :update, :id => Operatingsystem.first + put :update, {:id => Operatingsystem.first}, set_session_user assert_template 'edit' end def test_update_valid Operatingsystem.any_instance.stubs(:valid?).returns(true) - put :update, :id => Operatingsystem.first + put :update, {:id => Operatingsystem.first}, set_session_user assert_redirected_to operatingsystems_url end def test_destroy operatingsystem = Operatingsystem.first - delete :destroy, :id => operatingsystem + delete :destroy, {:id => operatingsystem}, set_session_user assert_redirected_to operatingsystems_url assert !Operatingsystem.exists?(operatingsystem.id) end diff --git a/test/functional/ptables_controller_test.rb b/test/functional/ptables_controller_test.rb index b79e187..10f3e5f 100644 --- a/test/functional/ptables_controller_test.rb +++ b/test/functional/ptables_controller_test.rb @@ -2,52 +2,52 @@ require 'test_helper' class PtablesControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_show - get :show, :id => Ptable.first + get :show, {:id => Ptable.first}, set_session_user assert_template 'show' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Ptable.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Ptable.any_instance.stubs(:valid?).returns(true) - post :create, :ptable => {:name => "dummy", :layout => "dummy"} + post :create, {:ptable => {:name => "dummy", :layout => "dummy"}}, set_session_user assert_redirected_to ptable_url(assigns(:ptable)) end def test_edit - get :edit, :id => Ptable.first + get :edit, {:id => Ptable.first}, set_session_user assert_template 'edit' end def test_update_invalid Ptable.any_instance.stubs(:valid?).returns(false) - put :update, :id => Ptable.first + put :update, {:id => Ptable.first}, set_session_user assert_template 'edit' end def test_update_valid Ptable.any_instance.stubs(:valid?).returns(true) - put :update, :id => Ptable.first + put :update, {:id => Ptable.first}, set_session_user assert_redirected_to ptable_url(assigns(:ptable)) end def test_destroy ptable = Ptable.first - delete :destroy, :id => ptable + delete :destroy, {:id => ptable}, set_session_user assert_redirected_to ptables_url assert !Ptable.exists?(ptable.id) end diff --git a/test/functional/puppetclasses_controller_test.rb b/test/functional/puppetclasses_controller_test.rb index 0f1c42c..affa372 100644 --- a/test/functional/puppetclasses_controller_test.rb +++ b/test/functional/puppetclasses_controller_test.rb @@ -2,47 +2,47 @@ require 'test_helper' class PuppetclassesControllerTest < ActionController::TestCase def test_index - get :index + get :index, {}, set_session_user assert_template 'index' end def test_new - get :new + get :new, {}, set_session_user assert_template 'new' end def test_create_invalid Puppetclass.any_instance.stubs(:valid?).returns(false) - post :create + post :create, {}, set_session_user assert_template 'new' end def test_create_valid Puppetclass.any_instance.stubs(:valid?).returns(true) - post :create + post :create, {}, set_session_user assert_redirected_to puppetclasses_url end def test_edit - get :edit, :id => Puppetclass.first + get :edit, {:id => Puppetclass.first}, set_session_user assert_template 'edit' end def test_update_invalid Puppetclass.any_instance.stubs(:valid?).returns(false) - put :update, :id => Puppetclass.first + put :update, {:id => Puppetclass.first}, set_session_user assert_template 'edit' end def test_update_valid Puppetclass.any_instance.stubs(:valid?).returns(true) - put :update, :id => Puppetclass.first + put :update, {:id => Puppetclass.first}, set_session_user assert_redirected_to puppetclasses_url end def test_destroy puppetclass = Puppetclass.first - delete :destroy, :id => puppetclass + delete :destroy, {:id => puppetclass}, set_session_user assert_redirected_to puppetclasses_url assert !Puppetclass.exists?(puppetclass.id) end diff --git a/test/functional/reports_controller_test.rb b/test/functional/reports_controller_test.rb index 801fd33..bcf27bb 100644 --- a/test/functional/reports_controller_test.rb +++ b/test/functional/reports_controller_test.rb @@ -16,7 +16,7 @@ class ReportsControllerTest < ActionController::TestCase end test "should get index" do - get :index + get :index, {}, set_session_user assert_response :success assert_not_nil assigns(:records) end @@ -37,7 +37,7 @@ class ReportsControllerTest < ActionController::TestCase create_a_report assert @report.save! - get :show, :id => @report.id + get :show, {:id => @report.id}, set_session_user assert_response :success end @@ -46,7 +46,7 @@ class ReportsControllerTest < ActionController::TestCase assert @report.save! assert_difference('Report.count', -1) do - delete :destroy, :id => @report.id + delete :destroy, {:id => @report.id}, set_session_user end assert_redirected_to reports_path diff --git a/test/functional/usergroups_controller_test.rb b/test/functional/usergroups_controller_test.rb new file mode 100644 index 0000000..b89f172 --- /dev/null +++ b/test/functional/usergroups_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class UsergroupsControllerTest < ActionController::TestCase + def test_index + get :index, {}, set_session_user + assert_template 'index' + end + + def test_new + get :new, {}, set_session_user + assert_template 'new' + end + + def test_create_invalid + Usergroup.any_instance.stubs(:valid?).returns(false) + post :create, {}, set_session_user + assert_template 'new' + end + + def test_create_valid + Usergroup.any_instance.stubs(:valid?).returns(true) + post :create, {}, set_session_user + assert_redirected_to usergroups_url + end + + def test_edit + get :edit, {:id => Usergroup.first}, set_session_user + assert_template 'edit' + end + + def test_update_invalid + Usergroup.any_instance.stubs(:valid?).returns(false) + put :update, {:id => Usergroup.first, :usergroup => {:user_ids => ["",""], :usergroup_ids => ["",""]} }, set_session_user + assert_template 'edit' + end + + def test_update_valid + Usergroup.any_instance.stubs(:valid?).returns(true) + put :update, {:id => Usergroup.first, :usergroup => {:user_ids => ["",""], :usergroup_ids => ["",""]} }, set_session_user + assert_redirected_to usergroups_url + end + + def test_destroy + usergroup = Usergroup.first + delete :destroy, {:id => usergroup}, set_session_user + assert_redirected_to usergroups_url + assert !Usergroup.exists?(usergroup.id) + end +end diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb index 55df56e..3aa6580 100644 --- a/test/functional/users_controller_test.rb +++ b/test/functional/users_controller_test.rb @@ -2,7 +2,7 @@ require 'test_helper' class UsersControllerTest < ActionController::TestCase test "should get index" do - get :index + get :index, {}, set_session_user assert_response :success end @@ -10,14 +10,14 @@ class UsersControllerTest < ActionController::TestCase u = User.new :login => "foo", :mail => "foo@bar.com" assert u.save! logger.info "************ ID = #{u.id}" - get :edit, :id => u.id + get :edit, {:id => u.id}, set_session_user #assert_response :success end test "should update user" do user = User.create :login => "foo", :mail => "foo@bar.com" - put :update, { :commit => "Update", :id => user.id, :record => {:login => "johnsmith"} } + put :update, { :commit => "Update", :id => user.id, :record => {:login => "johnsmith"} }, set_session_user mod_user = User.find_by_id(user.id) assert mod_user.login == "johnsmith" @@ -26,15 +26,15 @@ class UsersControllerTest < ActionController::TestCase test "should get show" do u = User.create :login => "foo", :mail => "foo@bar.com" - get :show, :id => u.id + get :show, {:id => u.id}, set_session_user assert_not_nil assigns("record") assert_response :success end test "should delete" do - u = User.create :login => "foo", :mail => "foo@bar.com" - assert_difference('User.count', -1) do - delete :destroy, :id => u.id - end + user = User.last + delete :destroy, {:id => user}, set_session_user + assert_redirected_to users_url + assert !User.exists?(user.id) end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 0eab832..f0162d6 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -43,4 +43,12 @@ class ActiveSupport::TestCase class Test::Unit::TestCase include RR::Adapters::TestUnit end + + def set_session_user + if SETTINGS[:ldap] or SETTINGS[:ldaps] + {:user => User.first} + else + {} + end + end end diff --git a/test/unit/helpers/usergroups_helper_test.rb b/test/unit/helpers/usergroups_helper_test.rb new file mode 100644 index 0000000..efd453b --- /dev/null +++ b/test/unit/helpers/usergroups_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class UsergroupsHelperTest < ActionView::TestCase +end diff --git a/test/unit/report_observer_test.rb b/test/unit/report_observer_test.rb index 4315eaa..461ffc9 100644 --- a/test/unit/report_observer_test.rb +++ b/test/unit/report_observer_test.rb @@ -12,6 +12,7 @@ class ReportObserverTest < ActiveSupport::TestCase :architecture => Architecture.find_or_create_by_name("i386"), :environment => Environment.find_or_create_by_name("envy"), :disk => "empty partition" + h.update_attribute :owner, User.first if SETTINGS[:ldap] p = Puppet::Transaction::Report.new p.save @@ -24,6 +25,7 @@ class ReportObserverTest < ActiveSupport::TestCase assert_difference 'ActionMailer::Base.deliveries.size' do @report.status = 16781381 # Error status. @report.save! + @report end end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index ec57242..c42f8b8 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -21,6 +21,13 @@ class UserTest < ActiveSupport::TestCase assert !u.valid? end + test "login should also be unique across usergroups" do + ug = Usergroup.create :name => "foo" + u = User.create :login => "foo", :mail => "foo@bar.com" + + assert !u.valid? + end + test "mail should have format" do u = User.create :login => "foo", :mail => "bar" assert !u.valid? diff --git a/test/unit/usergroup_test.rb b/test/unit/usergroup_test.rb new file mode 100644 index 0000000..0469633 --- /dev/null +++ b/test/unit/usergroup_test.rb @@ -0,0 +1,100 @@ +require 'test_helper' + +class UsergroupTest < ActiveSupport::TestCase + + test "usergroups should be creatable" do + assert Usergroup.create(:name => "name").valid? + end + + test "name should be unique" do + one = Usergroup.create :name => "one" + two = Usergroup.create :name => "one" + + assert !two.valid? + end + + test "name is unique across user as well as usergroup" do + user = User.create :login => "user", :mail => "user@someware.com" + usergroup = Usergroup.create :name => "user" + + assert !usergroup.valid? + end + + def populate_usergroups + @u1 = User.find_or_create_by_login :login => "u1", :mail => "u1@someware.com", :firstname => "u1" + @u2 = User.find_or_create_by_login :login => "u2", :mail => "u2@someware.com", :firstname => "u2" + @u3 = User.find_or_create_by_login :login => "u3", :mail => "u3@someware.com", :firstname => "u3" + @u4 = User.find_or_create_by_login :login => "u4", :mail => "u4@someware.com", :firstname => "u4" + @u5 = User.find_or_create_by_login :login => "u5", :mail => "u5@someware.com", :firstname => "u5" + @u6 = User.find_or_create_by_login :login => "u6", :mail => "u6@someware.com", :firstname => "u6" + + @ug1 = Usergroup.find_or_create_by_name :name => "ug1" + @ug2 = Usergroup.find_or_create_by_name :name => "ug2" + @ug3 = Usergroup.find_or_create_by_name :name => "ug3" + @ug4 = Usergroup.find_or_create_by_name :name => "ug4" + @ug5 = Usergroup.find_or_create_by_name :name => "ug5" + @ug6 = Usergroup.find_or_create_by_name :name => "ug6" + + @ug1.users = [@u1, @u2] + @ug2.users = [@u2, @u3] + @ug3.users = [@u3, @u4] + @ug3.usergroups = [@ug1] + @ug4.usergroups = [@ug1, @ug2] + @ug5.usergroups = [@ug1, @ug3, @ug4] + @ug5.users = [@u5] + end + + test "hosts should be retrieved from recursive/complex usergroup definitions" do + populate_usergroups + + Host.with_options :architecture => Architecture.first, :environment => Environment.first, :operatingsystem => Operatingsystem.first, :ptable => Ptable.first do |object| + @h1 = object.find_or_create_by_name :name => "h1.someware.com", :ip => "192.168.3.1", :mac => "223344556601", :owner => @u1 + @h2 = object.find_or_create_by_name :name => "h2.someware.com", :ip => "192.168.3.2", :mac => "223344556602", :owner => @ug2 + @h3 = object.find_or_create_by_name :name => "h3.someware.com", :ip => "192.168.3.3", :mac => "223344556603", :owner => @u3 + @h4 = object.find_or_create_by_name :name => "h4.someware.com", :ip => "192.168.3.4", :mac => "223344556604", :owner => @ug5 + @h5 = object.find_or_create_by_name :name => "h5.someware.com", :ip => "192.168.3.5", :mac => "223344556605", :owner => @u2 + @h6 = object.find_or_create_by_name :name => "h6.someware.com", :ip => "192.168.3.6", :mac => "223344556606", :owner => @ug3 + end + assert @u1.hosts.sort == [@h1] + assert @u2.hosts.sort == [@h2, @h5] + assert @u3.hosts.sort == [@h2, @h3, @h6] + assert @u4.hosts.sort == [@h6] + assert @u5.hosts.sort == [@h2, @h4, @h6] + assert @u6.hosts.sort == [] + end + + test "addresses should be retrieved from recursive/complex usergroup definitions" do + populate_usergroups + + assert @ug1.recipients.sort == %w{u1@someware.com u2@someware.com} + assert @ug2.recipients.sort == %w{u2@someware.com u3@someware.com} + assert @ug3.recipients.sort == %w{u1@someware.com u2@someware.com u3@someware.com u4@someware.com} + assert @ug4.recipients.sort == %w{u1@someware.com u2@someware.com u3@someware.com} + assert @ug5.recipients.sort == %w{u1@someware.com u2@someware.com u3@someware.com u4@someware.com u5@someware.com} + end + + test "cannot be destroyed when in use by a host" do + @ug1 = Usergroup.find_or_create_by_name :name => "ug1" + @h1 = Host.find_or_create_by_name :name => "h1.someware.com", :ip => "192.168.3.1", :mac => "223344556601", :owner => @ug1, :architecture => Architecture.first, + :environment => Environment.first, :operatingsystem => Operatingsystem.first, :ptable => Ptable.first + @ug1.destroy + assert @ug1.errors.full_messages[0] == "ug1 is used by h1.someware.com" + end + + test "cannot be destroyed when in use by another usergroup" do + @ug1 = Usergroup.find_or_create_by_name :name => "ug1" + @ug2 = Usergroup.find_or_create_by_name :name => "ug2" + @ug1.usergroups = [@ug2] + @ug1.destroy + assert @ug1.errors.full_messages[0] == "ug1 is used by ug2" + end + + test "removes user join model records" do + ug1 = Usergroup.find_or_create_by_name :name => "ug1" + u1 = User.find_or_create_by_login :login => "u1", :mail => "u1@someware.com" + ug1.users = [u1] + assert_difference('UsergroupMember.count', -1) do + ug1.destroy + end + end +end diff --git a/vendor/plugins/has_many_polymorphs b/vendor/plugins/has_many_polymorphs new file mode 160000 index 0000000..d637f99 --- /dev/null +++ b/vendor/plugins/has_many_polymorphs @@ -0,0 +1 @@ +Subproject commit d637f999d256a32da27aedb7e8ccd70e2a90a636