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)
This commit is contained in:
Patrick Donelan 2009-09-25 14:13:15 +10:00
parent 79f84aec68
commit 549f9ce650
3 changed files with 85 additions and 14 deletions

View file

@ -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

View file

@ -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 = <<END_SQL;
select r.Survey_responseId, r.username, r.userId, upd.email, upd.firstName, upd.lastName, r.startDate, s.timeLimit, s.doAfterTimeLimit, ad.title, ad.url
from Survey s, Survey_response r, assetData ad, userProfileData upd
where r.isComplete = 0
and s.timeLimit > 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 <<END_SQL;
select
r.Survey_responseId, r.username, r.userId, r.startDate,
upd.email, upd.firstName, upd.lastName,
s.timeLimit, s.doAfterTimeLimit,
ad.title, ad.url
from
Survey_response r, Survey s, assetData ad, userProfileData upd
where
r.isComplete = 0
and s.timeLimit > 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;

View file

@ -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;
}