diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index ce47bcfce..53746866c 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -9,6 +9,7 @@ - fixed #11018: no lowercase typing possible in addressbook - fixed #11033: Calendar, recurring dates - fixed #11038: My Carousel Broke + - fixed ExpireIncompleteSurveyResponses workflow sending one email per asset revision 7.8.0 - upgraded YUI to 2.8.0r4 diff --git a/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm b/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm index 36360fb33..03b836d9d 100644 --- a/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm +++ b/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm @@ -20,6 +20,7 @@ use base 'WebGUI::Workflow::Activity'; use WebGUI::Asset; use WebGUI::DateTime; use DateTime::Duration; +use WebGUI::Mail::Send; =head1 NAME @@ -106,19 +107,7 @@ sub execute { my $self = shift; my $session = $self->session; - my $sql = < 0 - and ( unix_timestamp() - r.startDate ) > ( s.timeLimit * 60 ) - and r.assetId = s.assetId - and ad.assetId = s.assetId - and ad.revisionDate = s.revisionDate - and upd.userId = r.userId -END_SQL - - my $refs = $self->session->db->buildArrayRefOfHashRefs($sql); + my $refs = $self->session->db->buildArrayRefOfHashRefs( $self->getSql ); for my $ref (@{$refs}) { if($self->get("deleteExpired")){ $session->log->debug("deleting response: $ref->{Survey_responseId} "); @@ -141,6 +130,8 @@ END_SQL responseId => $ref->{Survey_responseId}, deleted => $self->get("deleteExpired"), companyName => $self->session->setting->get("companyName"), + username => $ref->{username}, + userId => $ref->{userId}, }; my $template = WebGUI::Asset->newByDynamicClass($self->session,$self->get('emailTemplateId')); my $message = $template->processTemplate($var, $self->get("emailTemplateId")); @@ -158,4 +149,35 @@ END_SQL return $self->COMPLETE; } +=head2 getSql + +Returns the SQL used to look up incomplete survey responses. + +Factored out into a separate subroutine for the sake of testability. + +=cut + +sub getSql { + + return < 0 + and ( unix_timestamp() - r.startDate ) > ( s.timeLimit * 60 ) + and r.assetId = s.assetId + and ad.assetId = s.assetId + and ad.revisionDate = s.revisionDate + and s.revisionDate = r.revisionDate + and upd.userId = r.userId +END_SQL + +} + 1; \ No newline at end of file diff --git a/t/Workflow/Activity/ExpireIncompleteSurveyResponses.t b/t/Workflow/Activity/ExpireIncompleteSurveyResponses.t index 43879c6e6..d80df1019 100644 --- a/t/Workflow/Activity/ExpireIncompleteSurveyResponses.t +++ b/t/Workflow/Activity/ExpireIncompleteSurveyResponses.t @@ -13,10 +13,12 @@ my $session = WebGUI::Test->session; #---------------------------------------------------------------------------- # Tests -plan tests => 15; +plan tests => 25; use_ok('WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses'); +my $SQL = WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses->getSql; + my $wf = WebGUI::Workflow->create($session, { title => 'Test ExpireIncompleteSurveyResponses', enabled => 1, @@ -42,6 +44,9 @@ $sJSON->newObject([0]); # add a question to 0th section $sJSON->update([0,0], { questionType => 'Yes/No' }); $survey->persistSurveyJSON; +# Initially, sql returns no resuts +is( scalar $session->db->buildArray($SQL), 0, 'No incomplete responses'); + # Now start a response as the test user $session->user( { user => $user } ); my $responseId = $survey->responseId; @@ -50,6 +55,9 @@ my ($endDate, $isComplete) = $session->db->quickArray('select endDate, isComplet is($endDate, 0, '..currently with no endDate'); is($isComplete, 0, '..and marked as in-progress'); +# Still no resuts +is( scalar $session->db->buildArray($SQL), 0, 'Still no incomplete responses'); + WebGUI::Workflow::Instance->create($session, { workflowId => $wf->getId, @@ -66,6 +74,9 @@ $survey->update( { timeLimit => 1 } ); $survey->startDate($survey->startDate - 100); ok($survey->hasTimedOut, '..until we set a timeLimit and push startDate into the past'); +# Now we have 1 incomplete response +is( scalar $session->db->buildArray($SQL), 1, 'Now we have 1 incomplete response'); + WebGUI::Workflow::Instance->create($session, { workflowId => $wf->getId, @@ -77,9 +88,16 @@ WebGUI::Workflow::Instance->create($session, ok($endDate, 'endDate now set'); is($isComplete, 3, '..and isComplete set to timeout code'); +# Afterwards, back to no incomplete responses +is( scalar $session->db->buildArray($SQL), 0, 'Afterwards, back to no incomplete responses'); + # Undo out handiwork, and chage doAfterTimeLimit to restartSurvey so that we get a different completeCode $session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]); $survey->update( { doAfterTimeLimit => 'restartSurvey' } ); + +# Now we have 1 incomplete response again +is( scalar $session->db->buildArray($SQL), 1, 'Now we have 1 incomplete response again'); + WebGUI::Workflow::Instance->create($session, { workflowId => $wf->getId, @@ -91,10 +109,36 @@ WebGUI::Workflow::Instance->create($session, ok($endDate, 'endDate set again'); is($isComplete, 4, '..and isComplete now set to timeoutRestart code'); +# Afterwards, back to no incomplete responses +is( scalar $session->db->buildArray($SQL), 0, 'Afterwards, back to no incomplete responses'); + +## +# Explicitly test for bug that existed in SQL whereby one email per revision would be sent +## + +# Create a new revision +$survey->addRevision({}, time+1); +WebGUI::Test->tagsToRollback(WebGUI::VersionTag->getWorking($session)); + +# Undo out handiwork again +is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 1, 'Start off with 1 response'); +$session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]); + +# Make sure SQL only returns 1 incomplete response +is( scalar $session->db->buildArray($SQL), 1, 'Make sure SQL only returns 1 incomplete response'); + +## +# Delete Expired +## + # Undo out handiwork again, and chage workflow to delete is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 1, 'Start off with 1 response'); $session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]); $activity->set('deleteExpired', 1); + +# Now we have 1 incomplete response again +is( scalar $session->db->buildArray($SQL), 1, 'Now we have 1 incomplete response again'); + WebGUI::Workflow::Instance->create($session, { workflowId => $wf->getId, @@ -104,6 +148,10 @@ WebGUI::Workflow::Instance->create($session, )->start; is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 0, 'Response has now been deleted'); +# Afterwards, back to no incomplete responses +is( scalar $session->db->buildArray($SQL), 0, 'Afterwards, back to no incomplete responses'); + END { $session->db->write('delete from Survey_response where userId = ?', [$user->userId]) if $user; + $survey->purge if $survey; }