diff --git a/init.rb b/init.rb index 1e88529..7b68dd0 100644 --- a/init.rb +++ b/init.rb @@ -19,5 +19,6 @@ end Rails.configuration.to_prepare do Stopwatch::UserPatch.apply + Stopwatch::TimeEntryPatch.apply end diff --git a/lib/stopwatch/time_entry_patch.rb b/lib/stopwatch/time_entry_patch.rb new file mode 100644 index 0000000..4580eca --- /dev/null +++ b/lib/stopwatch/time_entry_patch.rb @@ -0,0 +1,18 @@ +module Stopwatch + module TimeEntryPatch + def self.apply + TimeEntry.prepend self unless TimeEntry < self + end + + def self.prepended(base) + base.class_eval do + before_destroy :stop_timer + end + end + + def stop_timer + t = Stopwatch::Timer.new(user) + t.update(stop: true) if t.running? + end + end +end diff --git a/test/unit/time_entry_test.rb b/test/unit/time_entry_test.rb new file mode 100644 index 0000000..b84c053 --- /dev/null +++ b/test/unit/time_entry_test.rb @@ -0,0 +1,24 @@ +require_relative '../test_helper' + +class StartTimerTest < ActiveSupport::TestCase + fixtures :users, :user_preferences, :time_entries, :projects, + :roles, :member_roles, :members, :enumerations, :enabled_modules + + setup do + @user = User.find 1 + @time_entry = TimeEntry.where(user_id: 1).first + # so we dont have to load all the issue and related fixtures: + @time_entry.update_column :issue_id, nil + end + + test "should stop timer before destroy" do + assert r = Stopwatch::StartTimer.new(@time_entry, user: @user).call + assert r.success?, r.inspect + assert User.find(@user.id).timer_running? + + @time_entry.destroy + + refute User.find(@user.id).timer_running? + end + +end