From 549f9ce65031a03dcaf2efe80c73b9efcaa570f7 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Fri, 25 Sep 2009 14:13:15 +1000 Subject: [PATCH] Fix bugs in ExpireIncompleteSurveyResponses Workflow Need to join on revisionDate otherwise one email per Survey revision will be sent. (Added explicit test for this) Some standard template vars were also missing - username and userId. (forward-port from webgui-7.7) --- docs/changelog/7.x.x.txt | 1 + .../ExpireIncompleteSurveyResponses.pm | 48 +++++++++++++----- .../ExpireIncompleteSurveyResponses.t | 50 ++++++++++++++++++- 3 files changed, 85 insertions(+), 14 deletions(-) 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; }