Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@googlemail.com>2014-08-20 20:02:08 +0400
committerThomas Steur <thomas.steur@googlemail.com>2014-08-20 20:02:08 +0400
commitb3dadf81c5d8eb397d5f2be1498ce1ae33c51319 (patch)
treece179838edbb67698438a4286cd77814c2994eb0
parent583a475ce9d8f9c9200bc3f9612d57f041be6e38 (diff)
refs #5989 #6026 let users define a goal depending on an event and fix the examples and condition was not updated when user changes the match_attribute
-rw-r--r--core/Tracker/GoalManager.php20
-rw-r--r--lang/en.json1
-rw-r--r--plugins/Events/Actions/ActionEvent.php15
-rw-r--r--plugins/Goals/API.php9
-rw-r--r--plugins/Goals/javascripts/goalsForm.js40
-rw-r--r--plugins/Goals/templates/_addEditGoal.twig8
-rw-r--r--plugins/Goals/templates/_formAddGoal.twig9
-rw-r--r--plugins/Goals/templates/_listGoalEdit.twig5
-rw-r--r--plugins/Goals/tests/APITest.php228
-rw-r--r--tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php24
-rwxr-xr-xtests/PHPUnit/Integration/TrackGoalsAllowMultipleConversionsPerVisitTest.php4
-rw-r--r--tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml25
-rw-r--r--tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitsSummary.get_day.xml16
13 files changed, 374 insertions, 30 deletions
diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php
index fbc73381aa..12e3865d2c 100644
--- a/core/Tracker/GoalManager.php
+++ b/core/Tracker/GoalManager.php
@@ -138,15 +138,29 @@ class GoalManager
|| ($attribute == 'file' && $actionType != Action::TYPE_DOWNLOAD)
|| ($attribute == 'external_website' && $actionType != Action::TYPE_OUTLINK)
|| ($attribute == 'manually')
+ || in_array($attribute, array('event_action', 'event_name', 'event_category')) && $actionType != Action::TYPE_EVENT
) {
continue;
}
$url = $decodedActionUrl;
- // Matching on Page Title
- if ($attribute == 'title') {
- $url = $action->getActionName();
+
+ switch ($attribute) {
+ case 'title':
+ // Matching on Page Title
+ $url = $action->getActionName();
+ break;
+ case 'event_action':
+ $url = $action->getEventAction();
+ break;
+ case 'event_name':
+ $url = $action->getEventName();
+ break;
+ case 'event_category':
+ $url = $action->getEventCategory();
+ break;
}
+
$pattern_type = $goal['pattern_type'];
$match = $this->isUrlMatchingGoal($goal, $pattern_type, $url);
diff --git a/lang/en.json b/lang/en.json
index abd9d25e92..b7dad2a8b2 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -930,6 +930,7 @@
"CaseSensitive": "Case sensitive match",
"ChooseGoal": "Choose Goal",
"ClickOutlink": "Click on a Link to an external website",
+ "SendEvent": "Send an event",
"ColumnAverageOrderRevenueDocumentation": "Average Order Value (AOV) is the total revenue from all Ecommerce Orders divided by the number of orders.",
"ColumnAveragePriceDocumentation": "The average revenue for this %s.",
"ColumnAverageQuantityDocumentation": "The average quantity of this %s sold in Ecommerce orders.",
diff --git a/plugins/Events/Actions/ActionEvent.php b/plugins/Events/Actions/ActionEvent.php
index 3791de794d..9921c8d39b 100644
--- a/plugins/Events/Actions/ActionEvent.php
+++ b/plugins/Events/Actions/ActionEvent.php
@@ -38,6 +38,21 @@ class ActionEvent extends Action
return (strlen($eventCategory) > 0 && strlen($eventAction) > 0);
}
+ public function getEventAction()
+ {
+ return $this->request->getParam('e_a');
+ }
+
+ public function getEventCategory()
+ {
+ return $this->request->getParam('e_c');
+ }
+
+ public function getEventName()
+ {
+ return $this->request->getParam('e_n');
+ }
+
public function getCustomFloatValue()
{
return $this->eventValue;
diff --git a/plugins/Goals/API.php b/plugins/Goals/API.php
index 43fff0bfdb..176cafad24 100644
--- a/plugins/Goals/API.php
+++ b/plugins/Goals/API.php
@@ -79,7 +79,7 @@ class API extends \Piwik\Plugin\API
*
* @param int $idSite
* @param string $name
- * @param string $matchAttribute 'url', 'title', 'file', 'external_website' or 'manually'
+ * @param string $matchAttribute 'url', 'title', 'file', 'external_website', 'manually', 'event_action', 'event_category' or 'event_name'
* @param string $pattern eg. purchase-confirmation.htm
* @param string $patternType 'regex', 'contains', 'exact'
* @param bool $caseSensitive
@@ -91,7 +91,7 @@ class API extends \Piwik\Plugin\API
public function addGoal($idSite, $name, $matchAttribute, $pattern, $patternType, $caseSensitive = false, $revenue = false, $allowMultipleConversionsPerVisit = false)
{
Piwik::checkUserHasAdminAccess($idSite);
- $this->checkPatternIsValid($patternType, $pattern);
+ $this->checkPatternIsValid($patternType, $pattern, $matchAttribute);
$name = $this->checkName($name);
$pattern = $this->checkPattern($pattern);
@@ -141,7 +141,7 @@ class API extends \Piwik\Plugin\API
Piwik::checkUserHasAdminAccess($idSite);
$name = $this->checkName($name);
$pattern = $this->checkPattern($pattern);
- $this->checkPatternIsValid($patternType, $pattern);
+ $this->checkPatternIsValid($patternType, $pattern, $matchAttribute);
Db::get()->update(Common::prefixTable('goal'),
array(
'name' => $name,
@@ -157,10 +157,11 @@ class API extends \Piwik\Plugin\API
Cache::regenerateCacheWebsiteAttributes($idSite);
}
- private function checkPatternIsValid($patternType, $pattern)
+ private function checkPatternIsValid($patternType, $pattern, $matchAttribute)
{
if ($patternType == 'exact'
&& substr($pattern, 0, 4) != 'http'
+ && substr($matchAttribute, 0, 6) != 'event_'
) {
throw new Exception(Piwik::translate('Goals_ExceptionInvalidMatchingString', array("http:// or https://", "http://www.yourwebsite.com/newsletter/subscribed.html")));
}
diff --git a/plugins/Goals/javascripts/goalsForm.js b/plugins/Goals/javascripts/goalsForm.js
index 643a9ce3af..400f3813c2 100644
--- a/plugins/Goals/javascripts/goalsForm.js
+++ b/plugins/Goals/javascripts/goalsForm.js
@@ -34,6 +34,25 @@ function showCancel() {
});
}
+function onMatchAttributeChange(matchAttribute)
+{
+ if ('event' === matchAttribute) {
+ $('.entityAddContainer .whereEvent').show();
+ $('.entityAddContainer .whereUrl').hide();
+ } else {
+ $('.entityAddContainer .whereEvent').hide();
+ $('.entityAddContainer .whereUrl').show();
+ }
+
+ $('#match_attribute_name').html(mappingMatchTypeName[matchAttribute]);
+ $('#examples_pattern').html(mappingMatchTypeExamples[matchAttribute]);
+}
+
+function updateMatchAttribute () {
+ var matchTypeId = $(this).val();
+ onMatchAttributeChange(matchTypeId);
+}
+
// init the goal form with existing goal value, if any
function initGoalForm(goalMethodAPI, submitText, goalName, matchAttribute, pattern, patternType, caseSensitive, revenue, allowMultiple, goalId) {
$('#goal_name').val(goalName);
@@ -46,6 +65,14 @@ function initGoalForm(goalMethodAPI, submitText, goalName, matchAttribute, patte
} else {
$('select[name=trigger_type] option[value=visitors]').prop('selected', true);
}
+
+ if (0 === matchAttribute.indexOf('event')) {
+ $('select[name=event_type] option[value=' + matchAttribute + ']').prop('selected', true);
+ matchAttribute = 'event';
+ }
+
+ onMatchAttributeChange(matchAttribute);
+
$('input[name=match_attribute][value=' + matchAttribute + ']').prop('checked', true);
$('input[name=allow_multiple][value=' + allowMultiple + ']').prop('checked', true);
$('#match_attribute_name').html(mappingMatchTypeName[matchAttribute]);
@@ -66,6 +93,7 @@ function initGoalForm(goalMethodAPI, submitText, goalName, matchAttribute, patte
}
function bindGoalForm() {
+
$('select[name=trigger_type]').click(function () {
var triggerTypeId = $(this).val();
if (triggerTypeId == "manually") {
@@ -79,10 +107,9 @@ function bindGoalForm() {
}
});
- $('input[name=match_attribute]').click(function () {
- var matchTypeId = $(this).val();
- $('#match_attribute_name').html(mappingMatchTypeName[matchTypeId]);
- $('#examples_pattern').html(mappingMatchTypeExamples[matchTypeId]);
+ $(document).bind('Goals.edit', function () {
+ $('input[name=match_attribute]').off('change', updateMatchAttribute);
+ $('input[name=match_attribute]').change(updateMatchAttribute);
});
$('#goal_submit').click(function () {
@@ -126,6 +153,11 @@ function ajaxAddGoal() {
parameters.caseSensitive = 0;
} else {
parameters.matchAttribute = $('input[name=match_attribute]:checked').val();
+
+ if (parameters.matchAttribute === 'event') {
+ parameters.matchAttribute = $('select[name=event_type]').val();
+ }
+
parameters.patternType = $('[name=pattern_type]').val();
parameters.pattern = encodeURIComponent($('input[name=pattern]').val());
parameters.caseSensitive = $('#case_sensitive').prop('checked') == true ? 1 : 0;
diff --git a/plugins/Goals/templates/_addEditGoal.twig b/plugins/Goals/templates/_addEditGoal.twig
index c8feb87bc5..f9449d8ce9 100644
--- a/plugins/Goals/templates/_addEditGoal.twig
+++ b/plugins/Goals/templates/_addEditGoal.twig
@@ -55,7 +55,8 @@
"url": "{{ 'Goals_URL'|translate }}",
"title": "{{ 'Goals_PageTitle'|translate }}",
"file": "{{ 'Goals_Filename'|translate }}",
- "external_website": "{{ 'Goals_ExternalWebsiteUrl'|translate }}"
+ "external_website": "{{ 'Goals_ExternalWebsiteUrl'|translate }}",
+ "event": "{{ 'Events_Event'|translate }}"
};
var mappingMatchTypeExamples = {
"url": "{{ 'General_ForExampleShort'|translate }} {{ 'Goals_Contains'|translate("'checkout/confirmation'") }} \
@@ -67,7 +68,10 @@
<br />{{ 'General_ForExampleShort'|translate }} {{ 'Goals_MatchesExpression'|translate("'(.*)\\\.zip'") }}",
"external_website": "{{ 'General_ForExampleShort'|translate }} {{ 'Goals_Contains'|translate("'amazon.com'") }} \
<br />{{ 'General_ForExampleShort'|translate }} {{ 'Goals_IsExactly'|translate("'http://mypartner.com/landing.html'") }} \
- <br />{{ 'General_ForExampleShort'|translate }} {{ 'Goals_MatchesExpression'|translate("'http://www.amazon.com\\\/(.*)\\\/yourAffiliateId'") }}"
+ <br />{{ 'General_ForExampleShort'|translate }} {{ 'Goals_MatchesExpression'|translate("'http://www.amazon.com\\\/(.*)\\\/yourAffiliateId'") }}",
+ "event": "{{ 'General_ForExampleShort'|translate }} {{ 'Goals_Contains'|translate("'video'") }} \
+ <br />{{ 'General_ForExampleShort'|translate }} {{ 'Goals_IsExactly'|translate("'click'") }} \
+ <br />{{ 'General_ForExampleShort'|translate }} {{ 'Goals_MatchesExpression'|translate("'(.*)_banner'") }}"
};
bindGoalForm();
diff --git a/plugins/Goals/templates/_formAddGoal.twig b/plugins/Goals/templates/_formAddGoal.twig
index 002df4954b..7bff75f8cb 100644
--- a/plugins/Goals/templates/_formAddGoal.twig
+++ b/plugins/Goals/templates/_formAddGoal.twig
@@ -25,6 +25,9 @@
<input type="radio" id="match_attribute_title" value="title" name="match_attribute"/>
<label for="match_attribute_title">{{ 'Goals_VisitPageTitle'|translate }}</label>
<br/>
+ <input type="radio" id="match_attribute_event" value="event" name="match_attribute"/>
+ <label for="match_attribute_event">{{ 'Goals_SendEvent'|translate }}</label>
+ <br/>
<input type="radio" id="match_attribute_file" value="file" name="match_attribute"/>
<label for="match_attribute_file">{{ 'Goals_Download'|translate }}</label>
<br/>
@@ -35,7 +38,11 @@
</tbody>
<tbody id="match_attribute_section">
<tr>
- <td class="first">{{ 'Goals_WhereThe'|translate }} <span id="match_attribute_name"></span></td>
+ <td class="first">{{ 'Goals_WhereThe'|translate }} <span class="whereUrl" id="match_attribute_name"></span><select name="event_type" class="whereEvent inp">
+ <option value="event_category">{{ 'Events_EventCategory'|translate }}</option>
+ <option value="event_action">{{ 'Events_EventAction'|translate }}</option>
+ <option value="event_name">{{ 'Events_EventName'|translate }}</option>
+ </select></td>
<td>
<select name="pattern_type" class="inp">
<option value="contains">{{ 'Goals_Contains'|translate("") }}</option>
diff --git a/plugins/Goals/templates/_listGoalEdit.twig b/plugins/Goals/templates/_listGoalEdit.twig
index 11c1172f90..5118cfb72a 100644
--- a/plugins/Goals/templates/_listGoalEdit.twig
+++ b/plugins/Goals/templates/_listGoalEdit.twig
@@ -50,7 +50,10 @@
"file": "{{ 'Goals_Download'|translate }}",
"url": "{{ 'Goals_VisitUrl'|translate }}",
"title": "{{ 'Goals_VisitPageTitle'|translate }}",
- "external_website": "{{ 'Goals_ClickOutlink'|translate }}"
+ "external_website": "{{ 'Goals_ClickOutlink'|translate }}",
+ "event_action": "{{ 'Goals_SendEvent'|translate }} ({{ 'Events_EventAction'|translate }})",
+ "event_category": "{{ 'Goals_SendEvent'|translate }} ({{ 'Events_EventCategory'|translate }})",
+ "event_name": "{{ 'Goals_SendEvent'|translate }} ({{ 'Events_EventName'|translate }})"
};
$(document).ready(function () {
diff --git a/plugins/Goals/tests/APITest.php b/plugins/Goals/tests/APITest.php
new file mode 100644
index 0000000000..010449e41f
--- /dev/null
+++ b/plugins/Goals/tests/APITest.php
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\Goals\tests;
+use Piwik\Access;
+use Piwik\Plugins\Goals\API;
+use Piwik\Tests\Fixture;
+
+/**
+ * @group Goals
+ * @group Plugins
+ * @group APITest
+ * @group Database
+ */
+class APITest extends \DatabaseTestCase
+{
+ /**
+ * @var API
+ */
+ private $api;
+
+ private $idSite = 1;
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->api = API::getInstance();
+
+ Fixture::createWebsite('2014-01-01 00:00:00');
+ Fixture::createWebsite('2014-01-01 00:00:00');
+ }
+
+ public function test_addGoal_shouldReturnGoalId_IfCreationIsSuccessful()
+ {
+ $idGoal = $this->createAnyGoal();
+
+ $this->assertSame(1, $idGoal);
+ }
+
+ public function test_addGoal_shouldSucceed_IfOnlyMinimumFieldsGiven()
+ {
+ $idGoal = $this->api->addGoal($this->idSite, 'MyName', 'url', 'http://www.test.de', 'exact');
+
+ $this->assertGoal($idGoal, 'MyName', 'url', 'http://www.test.de', 'exact', 0, 0, 0);
+ }
+
+ public function test_addGoal_ShouldSucceed_IfAllFieldsGiven()
+ {
+ $idGoal = $this->api->addGoal($this->idSite, 'MyName', 'url', 'http://www.test.de', 'exact', true, 50, true);
+
+ $this->assertGoal($idGoal, 'MyName', 'url', 'http://www.test.de', 'exact', 1, 50, 1);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Goals_ExceptionInvalidMatchingString
+ */
+ public function test_addGoal_shouldThrowException_IfPatternTypeIsExactAndMatchAttributeNotEvent()
+ {
+ $this->api->addGoal($this->idSite, 'MyName', 'url', 'www.test.de', 'exact');
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Goals_ExceptionInvalidMatchingString
+ */
+ public function test_addGoal_shouldThrowException_IfPatternTypeIsExactAndMatchAttributeNotEvent2()
+ {
+ $this->api->addGoal($this->idSite, 'MyName', 'external_website', 'www.test.de', 'exact');
+ }
+
+ public function test_addGoal_shouldNotThrowException_IfPatternTypeIsExactAndMatchAttributeIsEvent()
+ {
+ $this->api->addGoal($this->idSite, 'MyName1', 'event_action', 'test', 'exact');
+ $this->api->addGoal($this->idSite, 'MyName2', 'event_name', 'test', 'exact');
+ $idGoal = $this->api->addGoal($this->idSite, 'MyName3', 'event_category', 'test', 'exact');
+
+ $this->assertSame('3', $idGoal);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage checkUserHasAdminAccess Fake exception
+ */
+ public function test_addGoal_shouldThrowException_IfNotEnoughPermission()
+ {
+ $this->setNonAdminUser();
+ $this->createAnyGoal();
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage checkUserHasAdminAccess Fake exception
+ */
+ public function test_updateGoal_shouldThrowException_IfNotEnoughPermission()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->assertSame(1, $idGoal); // make sure goal is created and does not already fail here
+ $this->setNonAdminUser();
+ $this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'url', 'www.test.de', 'exact');
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Goals_ExceptionInvalidMatchingString
+ */
+ public function test_updateGoal_shouldThrowException_IfPatternTypeIsExactAndMatchAttributeNotEvent()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'url', 'www.test.de', 'exact');
+ }
+
+ public function test_updateGoal_shouldNotThrowException_IfPatternTypeIsExactAndMatchAttributeIsEvent()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'event_action', 'www.test.de', 'exact');
+ $this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'event_category', 'www.test.de', 'exact');
+ $this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'event_name', 'www.test.de', 'exact');
+
+ $this->assertSame(1, $idGoal);
+ }
+
+ public function test_updateGoal_shouldUpdateAllGivenFields()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->api->updateGoal($this->idSite, $idGoal, 'UpdatedName', 'file', 'http://www.updatetest.de', 'contains', true, 999, true);
+
+ $this->assertGoal($idGoal, 'UpdatedName', 'file', 'http://www.updatetest.de', 'contains', 1, 999, 1);
+ }
+
+ public function test_updateGoal_shouldUpdateMinimalFields_ShouldLeaveOtherFieldsUntouched()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->api->updateGoal($this->idSite, $idGoal, 'UpdatedName', 'file', 'http://www.updatetest.de', 'contains');
+
+ $this->assertGoal($idGoal, 'UpdatedName', 'file', 'http://www.updatetest.de', 'contains', 0, 0, 0);
+ }
+
+ public function test_deleteGoal_shouldNotDeleteAGoal_IfGoalIdDoesNotExist()
+ {
+ $this->assertHasNoGoals();
+
+ $this->createAnyGoal();
+ $this->assertHasGoals();
+
+ $this->api->deleteGoal($this->idSite, 999);
+ $this->assertHasGoals();
+ }
+
+ public function test_deleteGoal_shouldNotDeleteAGoal_IfSiteDoesNotMatchGoalId()
+ {
+ $this->assertHasNoGoals();
+
+ $idGoal = $this->createAnyGoal();
+ $this->assertHasGoals();
+
+ $this->api->deleteGoal($idSite = 2, $idGoal);
+ $this->assertHasGoals();
+ }
+
+ public function test_deleteGoal_shouldDeleteAGoal_IfGoalAndSiteMatches()
+ {
+ $this->assertHasNoGoals();
+
+ $idGoal = $this->createAnyGoal();
+ $this->assertHasGoals();
+
+ $this->api->deleteGoal($this->idSite, $idGoal);
+ $this->assertHasNoGoals();
+ }
+
+ private function assertHasGoals()
+ {
+ $goals = $this->getGoals();
+ $this->assertNotEmpty($goals);
+ }
+
+ private function assertHasNoGoals()
+ {
+ $goals = $this->getGoals();
+ $this->assertEmpty($goals);
+ }
+
+ private function assertGoal($idGoal, $name, $url, $pattern, $patternType, $caseSenstive = 0, $revenue = 0, $allowMultiple = 0)
+ {
+ $expected = array($idGoal => array(
+ 'idsite' => $this->idSite,
+ 'idgoal' => $idGoal,
+ 'name' => $name,
+ 'match_attribute' => $url,
+ 'pattern' => $pattern,
+ 'pattern_type' => $patternType,
+ 'case_sensitive' => $caseSenstive,
+ 'allow_multiple' => $allowMultiple,
+ 'revenue' => $revenue,
+ 'deleted' => 0
+ ));
+
+ $goals = $this->getGoals();
+
+ $this->assertEquals($expected, $goals);
+ }
+
+ private function getGoals()
+ {
+ return $this->api->getGoals($this->idSite);
+ }
+
+ private function createAnyGoal()
+ {
+ return $this->api->addGoal($this->idSite, 'MyName1', 'event_action', 'test', 'exact');
+ }
+
+ protected function setNonAdminUser()
+ {
+ $pseudoMockAccess = new \FakeAccess;
+ \FakeAccess::setSuperUserAccess(false);
+ \FakeAccess::$idSitesView = array(99);
+ \FakeAccess::$identity = 'aUser';
+ Access::setSingletonInstance($pseudoMockAccess);
+ }
+
+}
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php b/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
index 74254a586e..185fc594a8 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
@@ -53,6 +53,18 @@ class SomeVisitsAllConversions extends Fixture
$revenue = 10, $allowMultipleConversions = true
);
}
+
+ if (!self::goalExists($idSite = 1, $idGoal = 3)) {
+ API::getInstance()->addGoal($this->idSite, 'click event', 'event_action', 'click', 'contains');
+ }
+
+ if (!self::goalExists($idSite = 1, $idGoal = 4)) {
+ API::getInstance()->addGoal($this->idSite, 'category event', 'event_category', 'The_Category', 'exact', true);
+ }
+
+ if (!self::goalExists($idSite = 1, $idGoal = 5)) {
+ API::getInstance()->addGoal($this->idSite, 'name event', 'event_name', 'the_name', 'exact');
+ }
}
private function trackVisits()
@@ -93,5 +105,17 @@ class SomeVisitsAllConversions extends Fixture
$t->setTokenAuth($this->getTokenAuth());
$t->setForceNewVisit();
$t->doTrackPageView('This is tracked in a new visit.');
+
+ // should trigger two goals at once (event_category, event_action)
+ $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.3)->getDatetime());
+ self::checkResponse($t->doTrackEvent('The_Category', 'click_action', 'name'));
+
+ // should not trigger a goal (the_category is case senstive goal)
+ $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.4)->getDatetime());
+ self::checkResponse($t->doTrackEvent('the_category', 'click_action', 'name'));
+
+ // should trigger a goal for event_name
+ $t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.4)->getDatetime());
+ self::checkResponse($t->doTrackEvent('other_category', 'other_action', 'the_name'));
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Integration/TrackGoalsAllowMultipleConversionsPerVisitTest.php b/tests/PHPUnit/Integration/TrackGoalsAllowMultipleConversionsPerVisitTest.php
index 6ed0f41a46..cac31449c2 100755
--- a/tests/PHPUnit/Integration/TrackGoalsAllowMultipleConversionsPerVisitTest.php
+++ b/tests/PHPUnit/Integration/TrackGoalsAllowMultipleConversionsPerVisitTest.php
@@ -39,11 +39,11 @@ class TrackGoalsAllowMultipleConversionsPerVisitTest extends IntegrationTestCase
// test delete is working as expected
$goals = API::getInstance()->getGoals($idSite);
- $this->assertTrue(2 == count($goals));
+ $this->assertTrue(5 == count($goals));
API::getInstance()->deleteGoal($idSite, self::$fixture->idGoal_OneConversionPerVisit);
API::getInstance()->deleteGoal($idSite, self::$fixture->idGoal_MultipleConversionPerVisit);
$goals = API::getInstance()->getGoals($idSite);
- $this->assertTrue(empty($goals));
+ $this->assertTrue(3 == count($goals));
}
public function getApiForTesting()
diff --git a/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml b/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml
index 38b1c4d247..9c6eba0c0c 100644
--- a/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitTime.getVisitInformationPerServerTime_day.xml
@@ -4,10 +4,10 @@
<label>0h</label>
<nb_uniq_visitors>1</nb_uniq_visitors>
<nb_visits>2</nb_visits>
- <nb_actions>2</nb_actions>
- <max_actions>1</max_actions>
- <sum_visit_length>1120</sum_visit_length>
- <bounce_count>2</bounce_count>
+ <nb_actions>5</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>363</sum_visit_length>
+ <bounce_count>0</bounce_count>
<goals>
<row idgoal='1'>
<nb_conversions>2</nb_conversions>
@@ -19,8 +19,23 @@
<nb_visits_converted>1</nb_visits_converted>
<revenue>666</revenue>
</row>
+ <row idgoal='3'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>0</revenue>
+ </row>
+ <row idgoal='4'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>0</revenue>
+ </row>
+ <row idgoal='5'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>0</revenue>
+ </row>
</goals>
- <nb_conversions>4</nb_conversions>
+ <nb_conversions>8</nb_conversions>
<revenue>1332</revenue>
</row>
<row>
diff --git a/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitsSummary.get_day.xml b/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitsSummary.get_day.xml
index 6a1390c2e5..76b20063bf 100644
--- a/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitsSummary.get_day.xml
+++ b/tests/PHPUnit/Integration/expected/test_trackGoals_allowMultipleConversionsPerVisit__VisitsSummary.get_day.xml
@@ -2,12 +2,12 @@
<result>
<nb_uniq_visitors>1</nb_uniq_visitors>
<nb_visits>2</nb_visits>
- <nb_actions>2</nb_actions>
- <nb_visits_converted>1</nb_visits_converted>
- <bounce_count>2</bounce_count>
- <sum_visit_length>1120</sum_visit_length>
- <max_actions>1</max_actions>
- <bounce_rate>100%</bounce_rate>
- <nb_actions_per_visit>1</nb_actions_per_visit>
- <avg_time_on_site>560</avg_time_on_site>
+ <nb_actions>5</nb_actions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <bounce_count>0</bounce_count>
+ <sum_visit_length>363</sum_visit_length>
+ <max_actions>3</max_actions>
+ <bounce_rate>0%</bounce_rate>
+ <nb_actions_per_visit>2.5</nb_actions_per_visit>
+ <avg_time_on_site>182</avg_time_on_site>
</result> \ No newline at end of file