From 3823bee3473aa58fbfd3428fb9674af9172079c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nick=20Fl=C3=BCckiger?= Date: Fri, 7 May 2021 15:22:53 +0200 Subject: [PATCH] Adding multiple unit tests (#27) --- Gemfile | 1 + Gemfile.lock | 6 +++ app/services/permission_manager.rb | 2 +- app/services/timer_entity_cleaner.rb | 1 + test/factories/timer_session.rb | 9 ++++ test/test_helper.rb | 23 ++++++--- test/unit/issue_connector_test.rb | 43 ++++++++++++++++ test/unit/permission_manager_test.rb | 15 ++++++ test/unit/session_creator_test.rb | 4 ++ test/unit/settings_manager_test.rb | 20 ++++++++ test/unit/time_rebalancer_test.rb | 69 ++++++++++++++++++++++++++ test/unit/time_splitter_test.rb | 44 ++++++++++++++++ test/unit/timer_entity_cleaner_test.rb | 38 ++++++++++++++ 13 files changed, 266 insertions(+), 9 deletions(-) create mode 100644 test/factories/timer_session.rb create mode 100644 test/unit/issue_connector_test.rb create mode 100644 test/unit/permission_manager_test.rb create mode 100644 test/unit/session_creator_test.rb create mode 100644 test/unit/settings_manager_test.rb create mode 100644 test/unit/time_rebalancer_test.rb create mode 100644 test/unit/time_splitter_test.rb create mode 100644 test/unit/timer_entity_cleaner_test.rb diff --git a/Gemfile b/Gemfile index 746ca63e..3d0c1718 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,3 @@ gem 'slim-rails' gem 'simplecov', '~> 0.21.2', require: false +gem "factory_bot_rails" diff --git a/Gemfile.lock b/Gemfile.lock index bf74c8f0..92a1bd67 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -24,6 +24,11 @@ GEM crass (1.0.6) docile (1.3.5) erubi (1.10.0) + factory_bot (6.1.0) + activesupport (>= 5.0.0) + factory_bot_rails (6.1.0) + factory_bot (~> 6.1.0) + railties (>= 5.0.0) i18n (1.8.10) concurrent-ruby (~> 1.0) loofah (2.9.1) @@ -78,6 +83,7 @@ PLATFORMS x86_64-linux DEPENDENCIES + factory_bot_rails simplecov (~> 0.21.2) slim-rails diff --git a/app/services/permission_manager.rb b/app/services/permission_manager.rb index ea56f18b..75b2dc7b 100644 --- a/app/services/permission_manager.rb +++ b/app/services/permission_manager.rb @@ -6,7 +6,7 @@ def can?(action, controller) end def cannot?(action, controller) - !allowed_to?(action, controller) + !can?(action, controller) end def forbidden_to_access_operation diff --git a/app/services/timer_entity_cleaner.rb b/app/services/timer_entity_cleaner.rb index e20480a2..54d5421e 100644 --- a/app/services/timer_entity_cleaner.rb +++ b/app/services/timer_entity_cleaner.rb @@ -18,5 +18,6 @@ def delete_connection_to_issues def delete_time_entries @timer_session.time_entries.destroy_all + @timer_session.timer_session_time_entries.delete_all end end diff --git a/test/factories/timer_session.rb b/test/factories/timer_session.rb new file mode 100644 index 00000000..3aec860e --- /dev/null +++ b/test/factories/timer_session.rb @@ -0,0 +1,9 @@ +# This will guess the User class +FactoryBot.define do + factory :timer_session do + timer_start { Time.zone.now - 1.hour } + timer_end { Time.zone.now } + comments { 'Working on tickets!' } + user { } + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index a26cd882..fd31223c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,23 +1,30 @@ # frozen_string_literal: true # Load the Redmine helper -require File.expand_path("#{File.dirname(__FILE__)}/../../../test/test_helper") require 'simplecov' +require 'factory_bot_rails' if Dir.pwd.match(/plugins\/redmine_tracky/) - covdir = 'coverage' + SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter else - covdir = 'plugins/redmine_tracky/coverage' + SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([SimpleCov::Formatter::HTMLFormatter]) end -SimpleCov.coverage_dir(covdir) +SimpleCov.coverage_dir('coverage/redmine_tracky') SimpleCov.start 'rails' do add_filter do |source_file| - # only show files belonging to planner, except init.rb which is not fully testable - source_file.filename.match(/redmine_tracky/).nil? || - !source_file.filename.match(/redmine_tracky\/init.rb/).nil? + !source_file.filename.include?('plugins/redmine_tracky') || !source_file.filename.end_with?('.rb') end end -SimpleCov.minimum_coverage 100 + +# SimpleCov.minimum_coverage 100 +FactoryBot.definition_file_paths = [File.expand_path('../factories', __FILE__)] +FactoryBot.find_definitions + +require File.expand_path("#{File.dirname(__FILE__)}/../../../test/test_helper") + +class ActiveSupport::TestCase + include FactoryBot::Syntax::Methods +end diff --git a/test/unit/issue_connector_test.rb b/test/unit/issue_connector_test.rb new file mode 100644 index 00000000..d311fbeb --- /dev/null +++ b/test/unit/issue_connector_test.rb @@ -0,0 +1,43 @@ +require File.expand_path('../test_helper', __dir__) + +class IssueConnectorTest < ActiveSupport::TestCase + fixtures :projects, :users, :email_addresses, :user_preferences, :members, :member_roles, :roles, + :groups_users, + :trackers, :projects_trackers, + :enabled_modules, + :versions, + :issue_statuses, :issue_categories, :issue_relations, :workflows, + :enumerations, + :issues, :journals, :journal_details, + :watchers, + :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, + :time_entries + + setup do + status = IssueStatus.find(1) + role = Role.find(1) + tracker = Tracker.find(1) + user = User.find(2) + @issue = Issue.generate!(:tracker => tracker, :status => status, + :project_id => 1, :author_id => 1) + end + + test 'successful creation' do + timer_session = FactoryBot.create(:timer_session, + user: User.find(2)) + IssueConnector.new([@issue.id.to_s], timer_session).run + assert_equal TimerSessionIssue.count, 1 + assert_equal TimerSessionIssue.first.issue_id, @issue.id + assert_equal TimerSessionIssue.first.timer_session_id, timer_session.id + end + + test 'failure on creation' do + timer_session = FactoryBot.create(:timer_session, + user: User.find(2)) + issue_connector = IssueConnector.new([(@issue.id + 1).to_s], timer_session) + issue_connector.run + assert_equal TimerSessionIssue.count, 0 + assert_equal issue_connector.errors.count, 1 + assert_equal issue_connector.errors, [{ invalid_issue_id: @issue.id + 1 }] + end +end diff --git a/test/unit/permission_manager_test.rb b/test/unit/permission_manager_test.rb new file mode 100644 index 00000000..c1771459 --- /dev/null +++ b/test/unit/permission_manager_test.rb @@ -0,0 +1,15 @@ +require File.expand_path('../test_helper', __dir__) + +class PermissionManagerTest < ActiveSupport::TestCase + test 'can? - default' do + assert_equal PermissionManager.new.can?(:edit, :timer_sessions), false + end + + test 'cannot? - default' do + assert_equal PermissionManager.new.cannot?(:edit, :timer_sessions), true + end + + test 'forbidden_to_access_operation' do + assert_equal PermissionManager.new.forbidden_to_access_operation, I18n.t('timer_sessions.permissions.not_allowed') + end +end diff --git a/test/unit/session_creator_test.rb b/test/unit/session_creator_test.rb new file mode 100644 index 00000000..5c2f46c0 --- /dev/null +++ b/test/unit/session_creator_test.rb @@ -0,0 +1,4 @@ +require File.expand_path('../test_helper', __dir__) + +class SessionCreatorTest < ActiveSupport::TestCase +end diff --git a/test/unit/settings_manager_test.rb b/test/unit/settings_manager_test.rb new file mode 100644 index 00000000..23da9060 --- /dev/null +++ b/test/unit/settings_manager_test.rb @@ -0,0 +1,20 @@ +require File.expand_path('../test_helper', __dir__) + +class SettingsManagerTest < ActiveSupport::TestCase + + test '#rounding_for_displayed_hours - default' do + assert_equal SettingsManager.rounding_for_displayed_hours, 2 + end + + test '#max_hours_recorded_per_day - default' do + assert_equal SettingsManager.max_hours_recorded_per_day, 24 + end + + test '#max_hours_recorded_per_session - default' do + assert_equal SettingsManager.max_hours_recorded_per_session, 24 + end + + test '#visible_hints - default' do + assert_equal SettingsManager.visible_hints, true + end +end diff --git a/test/unit/time_rebalancer_test.rb b/test/unit/time_rebalancer_test.rb new file mode 100644 index 00000000..d04840f2 --- /dev/null +++ b/test/unit/time_rebalancer_test.rb @@ -0,0 +1,69 @@ +require File.expand_path('../test_helper', __dir__) + +class TimeRebalancerTest < ActiveSupport::TestCase + fixtures :projects, :users, :email_addresses, :user_preferences, :members, :member_roles, :roles, + :groups_users, + :trackers, :projects_trackers, + :enabled_modules, + :versions, + :issue_statuses, :issue_categories, :issue_relations, :workflows, + :enumerations, + :issues, :journals, :journal_details, + :watchers, + :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, + :time_entries + + setup do + @issue = Issue.find(1) + @timer_session = FactoryBot.create(:timer_session, + user: User.find(2)) + TimerSessionIssue.create!( + issue_id: @issue.id, + timer_session_id: @timer_session.id + ) + + TimerSessionTimeEntry.create!( + time_entry_id: TimeEntry.find(1).id, + timer_session_id: @timer_session.id + ) + @timer_session.reload + end + + test '#rebalance_entries - issues changed' do + TimeRebalancer.new([Issue.find(2).id], @timer_session).rebalance_entries + @timer_session.reload + assert_equal 1, TimerSessionIssue.count + assert_equal [2], @timer_session.issue_ids + end + + test '#rebalance_entries - issues not changed - times changed' do + @timer_session.update(timer_start: Time.zone.now - 2.hours) + timer_before_change = @timer_session.time_entries.first.hours + TimeRebalancer.new(@timer_session.issue_ids, @timer_session).rebalance_entries + + assert_equal timer_before_change + 1, TimeEntry.find( + @timer_session.time_entries.first.id + ).hours + end + + test '#rebalance_entries - issues not changed - comments changed' do + @timer_session.update(comments: "Different comment") + TimeRebalancer.new(@timer_session.issue_ids, @timer_session).rebalance_entries + + assert_equal 'Different comment', TimeEntry.find( + @timer_session.time_entries.first.id + ).comments + end + + test '#force_rebalance' do + issue_id = @issue.id + assert_equal 1, TimerSessionTimeEntry.count + assert_equal 1, TimerSessionIssue.count + + TimeRebalancer.new([@issue.id.to_s], @timer_session).force_rebalance + + assert_equal 1, TimerSessionTimeEntry.count + assert_equal 1, TimerSessionIssue.count + assert_equal issue_id, @timer_session.issues.first.id + end +end diff --git a/test/unit/time_splitter_test.rb b/test/unit/time_splitter_test.rb new file mode 100644 index 00000000..febf868a --- /dev/null +++ b/test/unit/time_splitter_test.rb @@ -0,0 +1,44 @@ +require File.expand_path('../test_helper', __dir__) + +class TimeSplitterTest < ActiveSupport::TestCase + fixtures :projects, :users, :email_addresses, :user_preferences, :members, :member_roles, :roles, + :groups_users, + :trackers, :projects_trackers, + :enabled_modules, + :versions, + :issue_statuses, :issue_categories, :issue_relations, :workflows, + :enumerations, + :issues, :journals, :journal_details, + :watchers, + :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values + setup do + @issue = Issue.find(1) + @timer_session = FactoryBot.create(:timer_session, + user: User.find(2)) + TimerSessionIssue.create!( + issue_id: @issue.id, + timer_session_id: @timer_session.id + ) + end + + test 'creates time entry on one issue' do + assert_equal @timer_session.issues.count, 1 + + time_splitter = TimeSplitter.new(@timer_session) + time_splitter.create_time_entries + assert_equal TimerSessionTimeEntry.count, 1 + end + + test 'splits time entries on multiple issues' do + TimerSessionIssue.create!( + issue_id: Issue.find(2).id, + timer_session_id: @timer_session.id + ) + assert_equal @timer_session.issues.count, 2 + + time_splitter = TimeSplitter.new(@timer_session) + time_splitter.create_time_entries + assert_equal 2, TimerSessionTimeEntry.count + assert_equal 0.5, TimeEntry.last.hours + end +end diff --git a/test/unit/timer_entity_cleaner_test.rb b/test/unit/timer_entity_cleaner_test.rb new file mode 100644 index 00000000..9fe482f1 --- /dev/null +++ b/test/unit/timer_entity_cleaner_test.rb @@ -0,0 +1,38 @@ +require File.expand_path('../test_helper', __dir__) + +class TimerEntityCleanerTest < ActiveSupport::TestCase + fixtures :projects, :users, :email_addresses, :user_preferences, :members, :member_roles, :roles, + :groups_users, + :trackers, :projects_trackers, + :enabled_modules, + :versions, + :issue_statuses, :issue_categories, :issue_relations, :workflows, + :enumerations, + :issues, :journals, :journal_details, + :watchers, + :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, + :time_entries + + setup do + @issue = Issue.find(1) + @timer_session = FactoryBot.create(:timer_session, + user: User.find(2)) + TimerSessionIssue.create!( + issue_id: @issue.id, + timer_session_id: @timer_session.id + ) + + TimerSessionTimeEntry.create!( + time_entry_id: TimeEntry.find(1), + timer_session_id: @timer_session.id + ) + end + + test 'removes time entries and connections to issue' do + assert_equal 1, TimerSessionTimeEntry.count + assert_equal 1, TimerSessionIssue.count + TimerEntityCleaner.new(@timer_session).run + assert_equal 0, TimerSessionTimeEntry.count + assert_equal 0, TimerSessionIssue.count + end +end