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
path: root/tests
diff options
context:
space:
mode:
authordiosmosis <diosmosis@users.noreply.github.com>2018-12-03 09:42:18 +0300
committerGitHub <noreply@github.com>2018-12-03 09:42:18 +0300
commited877857e59ec5434153e7142b75f67208ef428e (patch)
tree8f5cd55a4434b9a07642ff56762c715fa68cd62c /tests
parent8ccbd91c8e177357d04309410d5bd689f7208132 (diff)
Fix build and make join table sort stable by using DFS (#13634)
* Try to fix php 7 tests. * Make join table sort stable. * Fix a test and try to debug php 7 build. * Try to fix two other tests. * Another build fix attempt. * try another attempt at a stable sort * debug travis build. * debug travis build. * debug travis build. * debug travis build. * anything? * See if using a DFS fixes the test. * Fix some tests and restore old travis.yml. * Handle string tables with implicit dependencies in join DFS. * Fix more tests. * Fix test that fails on mysqli. * Use is_numeric instead of regex. * Better original format Site fix. * Remove TODO and add Note. * Cannot use is_numeric. * Clean table sorting code. * remove unneeded file * Fix test and only convert site properties based on property list. * Fixing some more tests.
Diffstat (limited to 'tests')
-rw-r--r--tests/PHPUnit/Framework/TestCase/SystemTestCase.php3
-rw-r--r--tests/PHPUnit/Integration/SegmentTest.php91
-rw-r--r--tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php238
-rw-r--r--tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php231
-rw-r--r--tests/UI/screenshot-diffs/missing-expected.list381
5 files changed, 275 insertions, 669 deletions
diff --git a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
index 9db84bc1a6..c270310257 100644
--- a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
@@ -754,7 +754,8 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
if (is_null($value)) {
$values[] = 'NULL';
} else {
- $isNumeric = preg_match('/^[1-9][0-9]*$/', $value);
+ // is_numeric cannot be used here since some strings will look like floating point numbers (eg 3e456)
+ $isNumeric = preg_match('/^\d+(\.\d+)?$/', $value);
if ($isNumeric) {
$values[] = $value;
} else if (!ctype_print($value)) {
diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php
index f2771a2e10..abb368c5c2 100644
--- a/tests/PHPUnit/Integration/SegmentTest.php
+++ b/tests/PHPUnit/Integration/SegmentTest.php
@@ -436,6 +436,7 @@ class SegmentTest extends IntegrationTestCase
$this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
}
+
public function test_getSelectQuery_whenJoiningManyCustomTablesItShouldKeepTheOrderAsDefined()
{
$actionType = 3;
@@ -496,24 +497,24 @@ class SegmentTest extends IntegrationTestCase
$logVisitTable = Common::prefixTable('log_visit');
$expected = array(
- "sql" => "
- SELECT log_link_visit_action.custom_dimension_1,
- log_action.name as url,
- sum(log_link_visit_action.time_spent) as `13`,
- sum(case log_visit.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `6`
- FROM $logLinkVisitActionTable AS log_link_visit_action
- LEFT JOIN $logActionTable AS log_action ON log_link_visit_action.idaction_url = log_action.idaction
- LEFT JOIN $logVisitTable AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action_foo ON log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit
- LEFT JOIN $logActionTable AS log_action_foo ON log_link_visit_action_foo.idaction_url = log_action_foo.idaction
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action_bar ON log_link_visit_action.idvisit = log_link_visit_action_bar.idvisit
- LEFT JOIN $logActionTable AS log_action_bar ON log_link_visit_action_bar.idaction_url = log_action_bar.idaction
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action_baz ON log_link_visit_action.idvisit = log_link_visit_action_baz.idvisit
- LEFT JOIN $logActionTable AS log_action_baz ON log_link_visit_action_baz.idaction_url = log_action_baz.idaction
- WHERE ( log_link_visit_action.server_time >= ?
- AND log_link_visit_action.server_time <= ?
- AND log_link_visit_action.idsite = ? )
- AND ( log_action.type = ? )",
+ "sql" => "
+ SELECT log_link_visit_action.custom_dimension_1,
+ log_action.name as url,
+ sum(log_link_visit_action.time_spent) as `13`,
+ sum(case log_visit.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `6`
+ FROM log_link_visit_action AS log_link_visit_action
+ LEFT JOIN $logActionTable AS log_action ON log_link_visit_action.idaction_url = log_action.idaction
+ LEFT JOIN $logVisitTable AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action_foo ON log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit
+ LEFT JOIN $logActionTable AS log_action_foo ON log_link_visit_action_foo.idaction_url = log_action_foo.idaction
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action_bar ON log_link_visit_action.idvisit = log_link_visit_action_bar.idvisit
+ LEFT JOIN $logActionTable AS log_action_bar ON log_link_visit_action_bar.idaction_url = log_action_bar.idaction
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action_baz ON log_link_visit_action.idvisit = log_link_visit_action_baz.idvisit
+ LEFT JOIN $logActionTable AS log_action_baz ON log_link_visit_action_baz.idaction_url = log_action_baz.idaction
+ WHERE ( log_link_visit_action.server_time >= ?
+ AND log_link_visit_action.server_time <= ?
+ AND log_link_visit_action.idsite = ? )
+ AND ( log_action.type = ? )",
"bind" => array('2015-11-30 11:00:00', '2015-12-01 10:59:59', $idSite, $actionType));
$this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -618,8 +619,7 @@ class SegmentTest extends IntegrationTestCase
"sql" => "
SELECT
log_inner.*
- FROM
- (
+ FROM (
SELECT
log_visit.*
FROM
@@ -627,15 +627,15 @@ class SegmentTest extends IntegrationTestCase
LEFT JOIN " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action ON log_link_visit_action.idvisit = log_visit.idvisit
LEFT JOIN " . Common::prefixTable('log_conversion') . " AS log_conversion ON log_conversion.idvisit = log_visit.idvisit
WHERE
- log_conversion.idgoal = ? AND HOUR(log_visit.visit_last_action_time) = ? AND log_link_visit_action.custom_var_k1 = ?
- AND (
- log_link_visit_action.idaction_url IS NOT NULL
- AND log_link_visit_action.idaction_url <> ''
- AND log_link_visit_action.idaction_url <> '0'
- )
+ log_conversion.idgoal = ? AND HOUR(log_visit.visit_last_action_time) = ? AND log_link_visit_action.custom_var_k1 = ?
+ AND (
+ log_link_visit_action.idaction_url IS NOT NULL
+ AND log_link_visit_action.idaction_url <> ''
+ AND log_link_visit_action.idaction_url <> '0'
+ )
GROUP BY log_visit.idvisit
ORDER BY NULL
- ) AS log_inner",
+ ) AS log_inner",
"bind" => array(1, 12, 'Test'));
$this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -716,14 +716,15 @@ class SegmentTest extends IntegrationTestCase
actionAlias.name as url,
sum(log_link_visit_action.time_spent) as `13`,
sum(case visitAlias.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) as `6`
- FROM $logLinkVisitActionTable AS log_link_visit_action
- LEFT JOIN $logActionTable AS log_action ON log_link_visit_action.idaction_url = log_action.idaction
- LEFT JOIN $logVisitTable AS visitAlias ON visitAlias.idvisit = log_link_visit_action.idvisit
+ FROM $logLinkVisitActionTable AS log_link_visit_action
+ LEFT JOIN $logVisitTable AS visitAlias ON visitAlias.idvisit = log_link_visit_action.idvisit
LEFT JOIN $logActionTable AS actionAlias ON log_link_visit_action.idaction_url = actionAlias.idaction
+ LEFT JOIN $logActionTable AS log_action ON log_link_visit_action.idaction_url = log_action.idaction
WHERE ( log_link_visit_action.server_time >= ?
AND log_link_visit_action.server_time <= ?
AND log_link_visit_action.idsite = ? )
AND ( log_action.type = ? )",
+
"bind" => array('2015-11-30 11:00:00', '2015-12-01 10:59:59', $idSite, $actionType));
$this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -964,16 +965,16 @@ class SegmentTest extends IntegrationTestCase
$expected = array(
"sql" => "
- SELECT log_inner.name AS 'EntryPageTitle', log_inner.name02fd90a35677a359ea5611a4bc456a6f AS 'EventAction', count(distinct log_inner.idvisit) AS 'nb_uniq_visits', count(distinct log_inner.idvisitor) AS 'nb_uniq_visitors', sum(case log_inner.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) AS 'bounce_count', sum(log_inner.visit_total_actions) AS 'sum_actions', sum(log_inner.visit_goal_converted) AS 'sum_visit_goal_converted'
- FROM (
- SELECT log_action_visit_entry_idaction_name.name, log_action_idaction_event_action.name as name02fd90a35677a359ea5611a4bc456a6f, log_visit.idvisit, log_visit.idvisitor, log_visit.visit_total_actions, log_visit.visit_goal_converted
- FROM $logVisitTable AS log_visit
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_link_visit_action.idvisit = log_visit.idvisit
- LEFT JOIN $logActionTable AS log_action_visit_entry_idaction_name ON log_visit.visit_entry_idaction_name = log_action_visit_entry_idaction_name.idaction
+ SELECT log_inner.name AS 'EntryPageTitle', log_inner.name02fd90a35677a359ea5611a4bc456a6f AS 'EventAction', count(distinct log_inner.idvisit) AS 'nb_uniq_visits', count(distinct log_inner.idvisitor) AS 'nb_uniq_visitors', sum(case log_inner.visit_total_actions when 1 then 1 when 0 then 1 else 0 end) AS 'bounce_count', sum(log_inner.visit_total_actions) AS 'sum_actions', sum(log_inner.visit_goal_converted) AS 'sum_visit_goal_converted'
+ FROM (
+ SELECT log_action_visit_entry_idaction_name.name, log_action_idaction_event_action.name as name02fd90a35677a359ea5611a4bc456a6f, log_visit.idvisit, log_visit.idvisitor, log_visit.visit_total_actions, log_visit.visit_goal_converted
+ FROM $logVisitTable AS log_visit
+ LEFT JOIN $logActionTable AS log_action_visit_entry_idaction_name ON log_visit.visit_entry_idaction_name = log_action_visit_entry_idaction_name.idaction
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_link_visit_action.idvisit = log_visit.idvisit
LEFT JOIN $logActionTable AS log_action_idaction_event_action ON log_link_visit_action.idaction_event_action = log_action_idaction_event_action.idaction
- ORDER BY nb_uniq_visits, log_action_idaction_event_action.name LIMIT 0, 33 )
- AS log_inner
- GROUP BY log_inner.name, log_inner.name02fd90a35677a359ea5611a4bc456a6f
+ ORDER BY nb_uniq_visits, log_action_idaction_event_action.name LIMIT 0, 33 )
+ AS log_inner
+ GROUP BY log_inner.name, log_inner.name02fd90a35677a359ea5611a4bc456a6f
ORDER BY nb_uniq_visits, log_inner.name02fd90a35677a359ea5611a4bc456a6f",
"bind" => array(1));
@@ -1501,7 +1502,7 @@ log_visit.visit_total_actions
AND ( ( log_link_visit_action.idaction_url IN (SELECT idaction FROM log_action WHERE ( name LIKE CONCAT('%', ?, '%') AND type = 1 )) ) )
GROUP BY CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)
ORDER BY NULL )
- AS log_inner GROUP BY log_inner.idgoal",
+ AS log_inner GROUP BY log_inner.idgoal",
"bind" => $expectedBind);
$this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -1591,19 +1592,17 @@ log_visit.visit_total_actions
SELECT log_inner.idgoal AS `idgoal`, count(*) AS `1`, count(distinct log_inner.idvisit) AS `3`, ROUND(SUM(log_inner.revenue),2) AS `2`
FROM (
SELECT log_conversion.idgoal, log_conversion.idvisit, log_conversion.revenue
- FROM $logConversionTable AS log_conversion
+ FROM log_conversion AS log_conversion
LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_link_visit_action.idvisit = log_conversion.idvisit
LEFT JOIN $logVisitTable AS log_visit ON log_visit.idvisit = log_conversion.idvisit
WHERE ( log_conversion.server_time >= ?
AND log_conversion.server_time <= ?
AND log_conversion.idsite IN (?) )
- AND ( (log_visit.visitor_returning = ?
- OR log_visit.visitor_returning = ?)
+ AND ( (log_visit.visitor_returning = ? OR log_visit.visitor_returning = ?)
AND ( log_link_visit_action.idaction_url IN (SELECT idaction FROM log_action WHERE ( name LIKE CONCAT('%', ?, '%') AND type = 1 )) ) )
GROUP BY CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)
- ORDER BY NULL )
- AS log_inner
- GROUP BY log_inner.idgoal",
+ ORDER BY NULL ) AS log_inner
+ GROUP BY log_inner.idgoal",
"bind" => $expectedBind);
$this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
index 4e211147a3..1012e58ec3 100644
--- a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
@@ -97,8 +97,8 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
));
$expected = 'log_link_visit_action AS log_link_visit_action ';
- $expected .= 'LEFT JOIN log_action AS log_action ON (log_link_visit_action.idaction_name = log_action.idaction AND log_link_visit_action.idaction_url = log_action.idaction) ';
- $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit';
+ $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
+ $expected .= 'LEFT JOIN log_action AS log_action ON (log_link_visit_action.idaction_name = log_action.idaction AND log_link_visit_action.idaction_url = log_action.idaction)';
$this->assertEquals($expected, $generator->getJoinString());
}
@@ -125,8 +125,8 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
));
$expected = 'log_visit AS log_visit ';
- $expected .= 'LEFT JOIN log_link_visit_action AS log_link_visit_action ON log_link_visit_action.idvisit = log_visit.idvisit ';
- $expected .= 'LEFT JOIN log_conversion AS log_conversion ON log_visit.idvisit2 = log_conversion.idvisit2';
+ $expected .= 'LEFT JOIN log_conversion AS log_conversion ON log_visit.idvisit2 = log_conversion.idvisit2 ';
+ $expected .= 'LEFT JOIN log_link_visit_action AS log_link_visit_action ON log_link_visit_action.idvisit = log_visit.idvisit';
$this->assertEquals($expected, $generator->getJoinString());
}
@@ -163,8 +163,8 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
));
$expected = 'log_link_visit_action AS log_link_visit_action ';
- $expected .= 'LEFT JOIN log_action AS log_action ON (log_link_visit_action.idaction_name = log_action.idaction AND log_link_visit_action.idaction_url = log_action.idaction) ';
- $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit';
+ $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
+ $expected .= 'LEFT JOIN log_action AS log_action ON (log_link_visit_action.idaction_name = log_action.idaction AND log_link_visit_action.idaction_url = log_action.idaction)';
$this->assertEquals($expected, $generator->getJoinString());
}
@@ -210,9 +210,9 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
));
$expected = 'log_link_visit_action AS log_link_visit_action ';
- $expected .= 'LEFT JOIN log_action AS log_action ON log_link_visit_action.idaction_url = log_action.idaction ';
$expected .= 'RIGHT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
- $expected .= 'RIGHT JOIN log_action AS log_action_r ON log_link_visit_action.idaction_test = log_action_r.idaction';
+ $expected .= 'RIGHT JOIN log_action AS log_action_r ON log_link_visit_action.idaction_test = log_action_r.idaction ';
+ $expected .= 'LEFT JOIN log_action AS log_action ON log_link_visit_action.idaction_url = log_action.idaction';
$this->assertEquals($expected, $generator->getJoinString());
}
@@ -234,228 +234,6 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($expected, $generator->getJoinString());
}
- public function test_sortTablesForJoin_shouldSortTablesAsSpecified()
- {
- $tables = array(
- 'log_action',
- array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
- 'log_conversion_item',
- 'log_link_visit_action',
- 'log_conversion',
- 'log_visit',
- );
-
- $generator = $this->makeGenerator($tables);
- $tables[] = 'log_foo_bar';
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $expected = array(
- 'log_link_visit_action',
- 'log_action',
- 'log_visit',
- 'log_conversion',
- 'log_conversion_item',
- 'log_foo_bar',
- array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
- );
-
- $this->assertEquals($expected, $tables);
- }
-
- public function test_sortTablesForJoin_anotherTestMakingSureWorksOhPhp5_5()
- {
- $tables = array (
- 1 => 'log_link_visit_action',
- 2 =>
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_idaction_name',
- 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
- ),
- 3 =>
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_visit_exit_idaction_name',
- 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
- ),
- )
- ;
-
- $generator = $this->makeGenerator($tables);
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $expected = array(
- 'log_link_visit_action',
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_visit_exit_idaction_name',
- 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
- ),
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_idaction_name',
- 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
- ),
- );
-
- $this->assertEquals($expected, $tables);
- }
-
- public function test_sortTablesForJoin_anotherTest2MakingSureWorksOhPhp5_5()
- {
- $tables = array (
- 1 => 'log_link_visit_action',
- 3 =>
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_visit_exit_idaction_name',
- 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
- ),
- 2 =>
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_idaction_name',
- 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
- ),
- )
- ;
-
- $generator = $this->makeGenerator($tables);
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $expected = array(
- 'log_link_visit_action',
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_idaction_name',
- 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
- ),
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_visit_exit_idaction_name',
- 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
- ),
- );
-
- $this->assertEquals($expected, $tables);
- }
-
- public function test_sortTablesForJoin_shouldSortTablesWithCustomJoinRequiringEachOther1()
- {
- $tables = array(
- 'log_link_visit_action',
- 'log_action',
- array(
- 'table' => 'log_link_visit_action',
- 'tableAlias' => 'log_link_visit_action_foo',
- 'joinOn' => "log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit"
- ),
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_foo',
- 'joinOn' => "log_link_visit_action_foo.idaction_url = log_action_foo.idaction"
- )
- );
-
- $generator = $this->makeGenerator($tables);
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $expected = array(
- 'log_link_visit_action',
- 'log_action',
- array (
- 'table' => 'log_link_visit_action',
- 'tableAlias' => 'log_link_visit_action_foo',
- 'joinOn' => 'log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit',
- ),
- array (
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_foo',
- 'joinOn' => 'log_link_visit_action_foo.idaction_url = log_action_foo.idaction',
- ),
- );
-
- $this->assertEquals($expected, $tables);
-
- // should still be the same if inverted
- $tables = array(
- 'log_link_visit_action',
- 'log_action',
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_foo',
- 'joinOn' => "log_link_visit_action_foo.idaction_url = log_action_foo.idaction"
- ),
- array(
- 'table' => 'log_link_visit_action',
- 'tableAlias' => 'log_link_visit_action_foo',
- 'joinOn' => "log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit"
- ),
- );
-
- $generator = $this->makeGenerator($tables);
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $this->assertEquals($expected, $tables);
-
- // should still be the same if inverted
- $tables = array(
- 'log_link_visit_action',
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_foo',
- 'joinOn' => "log_link_visit_action_foo.idaction_url = log_action_foo.idaction"
- ),
- 'log_action',
- array(
- 'table' => 'log_link_visit_action',
- 'tableAlias' => 'log_link_visit_action_foo',
- 'joinOn' => "log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit"
- ),
- );
-
- $generator = $this->makeGenerator($tables);
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $this->assertEquals($expected, $tables);
- }
-
- public function test_sortTablesForJoin_shouldSortTablesWithCustomJoinRequiringEachOther2()
- {
- $tables = array(
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_visit_entry_idaction_name',
- 'joinOn' => "log_visit.visit_entry_idaction_name = log_action_visit_entry_idaction_name.idaction"
- ),
- 'log_link_visit_action',
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_idaction_event_action',
- 'joinOn' => "log_link_visit_action.idaction_event_action = log_action_idaction_event_action.idaction"
- )
- );
-
- $generator = $this->makeGenerator($tables);
- usort($tables, array($generator, 'sortTablesForJoin'));
-
- $expected = array(
- 'log_link_visit_action',
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_idaction_event_action',
- 'joinOn' => "log_link_visit_action.idaction_event_action = log_action_idaction_event_action.idaction"
- ),
- array(
- 'table' => 'log_action',
- 'tableAlias' => 'log_action_visit_entry_idaction_name',
- 'joinOn' => "log_visit.visit_entry_idaction_name = log_action_visit_entry_idaction_name.idaction"
- )
- );
-
- $this->assertEquals($expected, $tables);
- }
-
private function generate($tables)
{
$generator = $this->makeGenerator($tables);
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
index ec1f7b49eb..33f5c4cdd0 100644
--- a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
@@ -141,23 +141,232 @@ class JoinTablesTest extends \PHPUnit_Framework_TestCase
public function test_sort_shouldNeverSortFirstEntry_AndNotMaintainKeys()
{
- $tables = $this->makeTables(array('log_conversion', 'log_visit', 'log_action', 'log_conversion_item'));
- $tables->sort(function($a, $b) {
- return strcmp($a, $b);
- });
+ $tables = $this->makeTables(array('log_action', 'log_conversion', 'log_visit', 'log_conversion_item'));
+ $tables->sort();
- $expected = array('log_conversion', 'log_action', 'log_conversion_item', 'log_visit');
+ $expected = array('log_action', 'log_visit', 'log_conversion', 'log_conversion_item');
$this->assertEquals($expected, $tables->getTables());
}
- public function test_sort_ifAllReturn0_ThenSortByGivenOrder()
+ public function test_sortTablesForJoin_shouldSortTablesAsSpecified()
{
- $tables = $this->makeTables(array('log_conversion', 'log_visit', 'log_action', 'log_conversion_item'));
- $tables->sort(function($a, $b) {
- return 0;
- });
+ $tables = array(
+ 'log_link_visit_action',
+ 'log_action',
+ array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+ 'log_conversion_item',
+ 'log_conversion',
+ 'log_visit',
+ array('table' => 'log_foo_bar'),
+ );
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $expected = array(
+ 'log_link_visit_action',
+ 'log_visit',
+ array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+ 'log_conversion_item',
+ 'log_action',
+ 'log_conversion',
+ array('table' => 'log_foo_bar'),
+ );
+
+ $this->assertEquals($expected, $tables->getTables());
+ }
+
+ public function test_sortTablesForJoin_anotherTestMakingSureWorksOhPhp5_5()
+ {
+ $tables = array (
+ 1 => 'log_link_visit_action',
+ 2 =>
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_idaction_name',
+ 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
+ ),
+ 3 =>
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_visit_exit_idaction_name',
+ 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
+ ),
+ )
+ ;
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $expected = array(
+ 'log_link_visit_action',
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_idaction_name',
+ 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
+ ),
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_visit_exit_idaction_name',
+ 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
+ ),
+ );
+
+ $this->assertEquals($expected, $tables->getTables());
+ }
+
+ public function test_sortTablesForJoin_anotherTest2MakingSureWorksOhPhp5_5()
+ {
+ $tables = array (
+ 1 => 'log_link_visit_action',
+ 3 =>
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_visit_exit_idaction_name',
+ 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
+ ),
+ 2 =>
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_idaction_name',
+ 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
+ ),
+ )
+ ;
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $expected = array(
+ 'log_link_visit_action',
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_visit_exit_idaction_name',
+ 'joinOn' => 'log_visit.visit_exit_idaction_name = log_action_visit_exit_idaction_name.idaction',
+ ),
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_idaction_name',
+ 'joinOn' => 'log_link_visit_action.idaction_name = log_action_idaction_name.idaction',
+ ),
+ );
+
+ $this->assertEquals($expected, $tables->getTables());
+ }
+
+ public function test_sortTablesForJoin_shouldSortTablesWithCustomJoinRequiringEachOther1()
+ {
+ $tables = array(
+ 'log_link_visit_action',
+ 'log_action',
+ array(
+ 'table' => 'log_link_visit_action',
+ 'tableAlias' => 'log_link_visit_action_foo',
+ 'joinOn' => "log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit"
+ ),
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_foo',
+ 'joinOn' => "log_link_visit_action_foo.idaction_url = log_action_foo.idaction"
+ )
+ );
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $expected = array(
+ 'log_link_visit_action',
+ 'log_action',
+ array (
+ 'table' => 'log_link_visit_action',
+ 'tableAlias' => 'log_link_visit_action_foo',
+ 'joinOn' => 'log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit',
+ ),
+ array (
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_foo',
+ 'joinOn' => 'log_link_visit_action_foo.idaction_url = log_action_foo.idaction',
+ ),
+ );
+
+ $this->assertEquals($expected, $tables->getTables());
+
+ // should still be the same if inverted
+ $tables = array(
+ 'log_link_visit_action',
+ 'log_action',
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_foo',
+ 'joinOn' => "log_link_visit_action_foo.idaction_url = log_action_foo.idaction"
+ ),
+ array(
+ 'table' => 'log_link_visit_action',
+ 'tableAlias' => 'log_link_visit_action_foo',
+ 'joinOn' => "log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit"
+ ),
+ );
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $this->assertEquals($expected, $tables->getTables());
+
+ // should still be the same if inverted
+ $tables = array(
+ 'log_link_visit_action',
+ 'log_action',
+ array(
+ 'table' => 'log_link_visit_action',
+ 'tableAlias' => 'log_link_visit_action_foo',
+ 'joinOn' => "log_link_visit_action.idvisit = log_link_visit_action_foo.idvisit"
+ ),
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_foo',
+ 'joinOn' => "log_link_visit_action_foo.idaction_url = log_action_foo.idaction"
+ ),
+ );
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $this->assertEquals($expected, $tables->getTables());
+ }
+
+ public function test_sortTablesForJoin_shouldSortTablesWithCustomJoinRequiringEachOther2()
+ {
+ $tables = array(
+ 'log_link_visit_action',
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_idaction_event_action',
+ 'joinOn' => "log_link_visit_action.idaction_event_action = log_action_idaction_event_action.idaction"
+ ),
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_visit_entry_idaction_name',
+ 'joinOn' => "log_visit.visit_entry_idaction_name = log_action_visit_entry_idaction_name.idaction"
+ ),
+ );
+
+ $tables = $this->makeTables($tables);
+ $tables->sort();
+
+ $expected = array(
+ 'log_link_visit_action',
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_idaction_event_action',
+ 'joinOn' => "log_link_visit_action.idaction_event_action = log_action_idaction_event_action.idaction"
+ ),
+ array(
+ 'table' => 'log_action',
+ 'tableAlias' => 'log_action_visit_entry_idaction_name',
+ 'joinOn' => "log_visit.visit_entry_idaction_name = log_action_visit_entry_idaction_name.idaction"
+ )
+ );
- $expected = array('log_conversion', 'log_visit', 'log_action', 'log_conversion_item');
$this->assertEquals($expected, $tables->getTables());
}
diff --git a/tests/UI/screenshot-diffs/missing-expected.list b/tests/UI/screenshot-diffs/missing-expected.list
deleted file mode 100644
index e91347ca22..0000000000
--- a/tests/UI/screenshot-diffs/missing-expected.list
+++ /dev/null
@@ -1,381 +0,0 @@
-TagManagerTeaser_superuser_page.png
-TagManagerTeaser_super_user_activate_plgin.png
-TagManagerTeaser_admin_page.png
-TagManagerTeaser_admin_page_disable.png
-TagManagerTeaser_superuser_page.png
-TagManagerTeaser_superuser_page.png
-TagManagerTeaser_super_user_activate_plgin.png
-TagManagerTeaser_admin_page.png
-TagManagerTeaser_admin_page_disable.png
-TagManagerTeaser_superuser_page.png
-TagManagerTeaser_super_user_activate_plgin.png
-TagManagerTeaser_admin_page.png
-TagManagerTeaser_admin_page_disable.png
-TagManagerTeaser_super_user_activate_plugin.png
-TagManagerTeaser_super_user_activate_plugin.png
-TagManagerTeaser_super_user_activate_plugin.png
-TagManagerTeaser_admin_page.png
-TagManagerTeaser_admin_page_disable.png
-TagManagerTeaser_admin_page_disable.png
-TagManagerTeaser_admin_page_disable.png
-Login_bruteforcelog_withentries.png
-Login_bruteforcelog_blockedapi.png
-Login_bruteforcelog_noentries.png
-Login_bruteforcelog_noentries.png
-Login_bruteforcelog_blockedlogin.png
-Login_bruteforcelog_noentries.png
-Login_bruteforcelog_noentries.png
-IntranetMeasurable_add_new_dialog.png
-IntranetMeasurable_intranet_create.png
-IntranetMeasurable_intranet_created.png
-IntranetMeasurable_intranet_create.png
-IntranetMeasurable_intranet_created.png
-TrackingFailures_widget_with_failures.png
-TrackingFailures_manage_no_failures.png
-TrackingFailures_manage_with_failures.png
-TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_widget_no_failures.png
-TrackingFailures_widget_with_failures.png
-TrackingFailures_manage_no_failures.png
-TrackingFailures_manage_with_failures.png
-TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_widget_no_failures.png
-TrackingFailures_widget_with_failures.png
-TrackingFailures_manage_no_failures.png
-TrackingFailures_manage_with_failures.png
-TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_widget_with_failures.png
-TrackingFailures_manage_no_failures.png
-TrackingFailures_manage_with_failures.png
-TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_no_failures.png
-TrackingFailures_manage_with_failures.png
-TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_all_confirmed.png
-TrackingFailures_manage_with_failures_delete_one_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_one_confirmed.png
-TrackingFailures_manage_with_failures_delete_all_ask_confirmation.png
-TrackingFailures_manage_with_failures_delete_all_confirmed.png
-CampaignBuilder_loaded.png
-CampaignBuilder_loaded.png
-CampaignBuilder_generate_url_nokeyword.png
-CampaignBuilder_generate_url_reset.png
-CampaignBuilder_generate_url_withkeyword.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes.png
-TwoFactorAuth_usersettings_twofa_enabled_required.png
-TwoFactorAuth_usersettings_twofa_disabled.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes.png
-TwoFactorAuth_usersettings_twofa_enabled_required.png
-TwoFactorAuth_usersettings_twofa_disabled.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_logme_not_verified.png
-TwoFactorAuth_logme_verified.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes.png
-TwoFactorAuth_usersettings_twofa_enabled_required.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_usersettings_twofa_disable_step2_confirm_password.png
-TwoFactorAuth_usersettings_twofa_disabled.png
-TwoFactorAuth_usersettings_twofa_setup.png
-TwoFactorAuth_logme_not_verified.png
-TwoFactorAuth_logme_not_verified_wrong_code.png
-TwoFactorAuth_logme_verified.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes.png
-TwoFactorAuth_usersettings_twofa_enabled_required.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_usersettings_twofa_disable_step2_confirm_password.png
-TwoFactorAuth_usersettings_twofa_disabled.png
-TwoFactorAuth_usersettings_twofa_setup.png
-TwoFactorAuth_logme_not_verified.png
-TwoFactorAuth_logme_not_verified_wrong_code.png
-TwoFactorAuth_logme_verified.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes.png
-TwoFactorAuth_usersettings_twofa_enabled_required.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_usersettings_twofa_disable_step2_confirm_password.png
-TwoFactorAuth_usersettings_twofa_disabled.png
-TwoFactorAuth_twofa_setup_step1.png
-TwoFactorAuth_twofa_setup_step2.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_forced_step1.png
-TwoFactorAuth_twofa_forced_step2.png
-TwoFactorAuth_twofa_forced_step3.png
-TwoFactorAuth_logme_not_verified.png
-TwoFactorAuth_logme_not_verified_wrong_code.png
-TwoFactorAuth_logme_verified.png
-TwoFactorAuth_logme_not_verified.png
-TwoFactorAuth_logme_not_verified_wrong_code.png
-TwoFactorAuth_logme_verified.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes.png
-TwoFactorAuth_usersettings_twofa_enabled_required.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_usersettings_twofa_disable_step2_confirm_password.png
-TwoFactorAuth_usersettings_twofa_disabled.png
-TwoFactorAuth_twofa_setup_step1.png
-TwoFactorAuth_twofa_setup_step2.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_forced_step1.png
-TwoFactorAuth_twofa_forced_step2.png
-TwoFactorAuth_twofa_forced_step3.png
-TwoFactorAuth_twofa_forced_step3.png
-TwoFactorAuth_usersettings_twofa_enabled.png
-TwoFactorAuth_show_recovery_codes_step1.png
-TwoFactorAuth_usersettings_twofa_disable_step1.png
-TwoFactorAuth_usersettings_twofa_disable_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_twofa_setup_step1.png
-TwoFactorAuth_twofa_setup_step2.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-TwoFactorAuth_show_recovery_codes_step1.png
-TwoFactorAuth_show_recovery_codes_step2.png
-TwoFactorAuth_show_recovery_codes_step1.png
-TwoFactorAuth_show_recovery_codes_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_twofa_setup_step1.png
-TwoFactorAuth_twofa_setup_step2.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-TwoFactorAuth_show_recovery_codes_step1.png
-TwoFactorAuth_show_recovery_codes_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_twofa_setup_step1.png
-TwoFactorAuth_twofa_setup_step2.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-TwoFactorAuth_show_recovery_codes_step1.png
-TwoFactorAuth_show_recovery_codes_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_usersettings_twofa_disable_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_usersettings_twofa_disable_step2.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_twofa_setup_step1.png
-TwoFactorAuth_twofa_setup_step2.png
-TwoFactorAuth_twofa_setup_step3.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_usersettings_twofa_disable_step3.png
-TwoFactorAuth_usersettings_twofa_disable_step4.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-TwoFactorAuthUsersManager_list.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_tab.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirm.png
-TwoFactorAuthUsersManager_edit_with_2fa_reset_confirmed.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-TwoFactorAuth_widgetized_no_verify.png
-TwoFactorAuth_widgetized_no_verify.png
-TwoFactorAuth_widgetized_no_verify.png
-TwoFactorAuth_widgetized_no_verify.png
-TwoFactorAuth_twofa_setup_step4.png
-TwoFactorAuth_twofa_forced_step4.png
-CustomTranslationReporting_simplePage.png
-CustomTranslationManage_loaded.png
-CustomTranslationManage_values_entered.png
-CustomTranslationManage_values_saved.png
-CustomTranslationManage_values_saved_verify.png
-CustomTranslationManage_loaded.png
-CustomTranslationManage_values_entered.png
-CustomTranslationManage_values_saved.png
-CustomTranslationManage_values_saved_verify.png
-CustomTranslationManage_loaded.png
-CustomTranslationManage_values_entered.png
-CustomTranslationManage_values_saved.png
-CustomTranslationManage_values_saved_verify.png
-CustomTranslationReporting_menu_loaded_dashboards.png
-CustomTranslationReporting_menu_loaded_visitors.png
-CustomTranslationReporting_menu_loaded_behaviour.png
-CustomTranslationReporting_menu_loaded_customreports.png
-CustomTranslationReporting_dashboard_rename.png
-CustomTranslationReporting_report_eventActionName.png
-CustomTranslationReporting_report_eventCategoryAction.png
-CustomTranslationReporting_report_visitDimension1.png
-CustomTranslationReporting_report_actionDimension3.png
-CustomTranslationReporting_report_customReports1.png
-CustomTranslationReporting_simplePagePartial.png
-CustomTranslationReporting_menu_loaded_customreports.png
-CustomTranslationReporting_dashboard_rename.png
-CustomTranslationReporting_report_eventActionName.png
-CustomTranslationReporting_report_eventActionName_row_evolution.png
-CustomTranslationReporting_report_eventActionName_segmented_visitor_log.png
-CustomTranslationReporting_report_eventActionName_search.png
-CustomTranslationReporting_report_eventActionName_bar.png
-CustomTranslationReporting_report_eventActionName_pie.png
-CustomTranslationReporting_report_eventActionName_pivoted.png
-CustomTranslationReporting_report_eventCategoryAction.png
-CustomTranslationReporting_report_visitDimension1.png
-CustomTranslationReporting_report_visitDimension1_row_evolution.png
-CustomTranslationReporting_report_visitDimension1_segmented_visitor_log.png
-CustomTranslationReporting_report_visitDimension1_search.png
-CustomTranslationReporting_report_visitDimension1_bar.png
-CustomTranslationReporting_report_visitDimension1_pie.png
-CustomTranslationReporting_report_visitDimension2.png
-CustomTranslationReporting_report_actionDimension3.png
-CustomTranslationReporting_report_actionDimension3_row_evolution.png
-CustomTranslationReporting_report_actionDimension3_segmented_visitor_log.png
-CustomTranslationReporting_report_actionDimension3_search.png
-CustomTranslationReporting_report_actionDimension3_bar.png
-CustomTranslationReporting_report_actionDimension3_pie.png
-CustomTranslationReporting_report_actionDimension4.png
-CustomTranslationReporting_report_customReports1.png
-CustomTranslationReporting_report_customReports1_row_evolution.png
-CustomTranslationReporting_report_customReports1_segmented_visitor_log.png
-CustomTranslationReporting_report_customReports1_search.png
-CustomTranslationReporting_report_customReports1_bar.png
-CustomTranslationReporting_report_customReports1_pie.png
-CustomTranslationReporting_report_customReports2.png
-CustomTranslationReporting_menu_loaded_customreports.png
-CustomTranslationReporting_report_eventActionName.png
-CustomTranslationReporting_report_eventActionName_row_evolution.png
-CustomTranslationReporting_report_eventActionName_segmented_visitor_log.png
-CustomTranslationReporting_report_eventActionName_search.png
-CustomTranslationReporting_report_eventActionName_bar.png
-CustomTranslationReporting_report_eventCategoryAction.png
-CustomTranslationReporting_report_visitDimension1.png
-CustomTranslationReporting_report_visitDimension1_row_evolution.png
-CustomTranslationReporting_report_visitDimension1_segmented_visitor_log.png
-CustomTranslationReporting_report_visitDimension1_search.png
-CustomTranslationReporting_report_visitDimension1_bar.png
-CustomTranslationReporting_report_visitDimension1_pie.png
-CustomTranslationReporting_report_visitDimension2.png
-CustomTranslationReporting_report_actionDimension3_row_evolution.png
-CustomTranslationReporting_report_actionDimension3_segmented_visitor_log.png
-CustomTranslationReporting_report_actionDimension3_search.png
-CustomTranslationReporting_report_actionDimension4.png
-CustomTranslationReporting_report_customReports1.png
-CustomTranslationReporting_report_customReports1_row_evolution.png
-CustomTranslationReporting_report_customReports1_segmented_visitor_log.png
-CustomTranslationReporting_report_customReports1_search.png
-CustomTranslationReporting_report_customReports1_bar.png
-CustomTranslationReporting_report_customReports1_pie.png
-CustomTranslationReporting_report_customReports2.png
-CustomTranslationReporting_report_customReports3.png
-CustomTranslationReporting_report_customReports4.png
-CustomTranslationReporting_menu_loaded_customreports.png
-CustomTranslationReporting_report_eventActionName.png
-CustomTranslationReporting_report_eventActionName_row_evolution.png
-CustomTranslationReporting_report_eventActionName_segmented_visitor_log.png
-CustomTranslationReporting_report_eventActionName_search.png
-CustomTranslationReporting_report_eventActionName_bar.png
-CustomTranslationReporting_report_eventCategoryAction.png
-CustomTranslationReporting_report_visitDimension1.png
-CustomTranslationReporting_report_visitDimension1_row_evolution.png
-CustomTranslationReporting_report_visitDimension1_segmented_visitor_log.png
-CustomTranslationReporting_report_visitDimension1_search.png
-CustomTranslationReporting_report_visitDimension1_bar.png
-CustomTranslationReporting_menu_loaded_customreports.png
-CustomTranslationReporting_report_eventActionName.png
-CustomTranslationReporting_report_eventActionName_row_evolution.png
-CustomTranslationReporting_report_eventActionName_segmented_visitor_log.png
-CustomTranslationReporting_report_eventActionName_search.png
-CustomTranslationReporting_report_eventActionName_bar.png
-CustomTranslationReporting_report_eventCategoryAction.png
-CustomTranslationReporting_report_visitDimension1.png
-CustomTranslationReporting_report_visitDimension1_row_evolution.png
-CustomTranslationReporting_report_visitDimension1_segmented_visitor_log.png
-CustomTranslationReporting_report_visitDimension1_search.png
-CustomTranslationReporting_report_visitDimension1_bar.png
-CustomTranslationReporting_report_visitDimension1_pie.png
-CustomTranslationReporting_report_visitDimension2.png
-CustomTranslationReporting_report_actionDimension3_row_evolution.png
-CustomTranslationReporting_report_actionDimension3_segmented_visitor_log.png
-CustomTranslationReporting_report_actionDimension4.png
-CustomTranslationReporting_report_customReports1.png
-CustomTranslationReporting_report_customReports2.png
-CustomTranslationReporting_report_customReports3.png
-CustomTranslationReporting_report_customReports3_row_evolution.png
-CustomTranslationReporting_report_customReports3_segmented_visitor_log.png
-CustomTranslationReporting_report_customReports3_search.png
-CustomTranslationReporting_report_customReports3_bar.png
-CustomTranslationReporting_report_customReports3_pie.png
-CustomTranslationReporting_report_customReports3_flat.png
-CustomTranslationReporting_report_customReports4.png
-CustomTranslationReporting_menu_loaded_customreports.png
-CustomTranslationReporting_report_eventActionName_row_evolution.png
-CustomTranslationReporting_report_eventActionName_segmented_visitor_log.png
-CustomTranslationReporting_report_eventActionName_search.png
-CustomTranslationReporting_report_eventActionName_bar.png
-CustomTranslationReporting_menu_loaded_dashboards.png
-CustomTranslationReporting_report_eventActionName_row_evolution.png
-CustomTranslationReporting_report_eventActionName_segmented_visitor_log.png
-CustomTranslationReporting_report_eventActionName_search.png
-CustomTranslationReporting_report_eventCategoryAction.png
-CustomTranslationReporting_report_visitDimension1_row_evolution.png
-CustomTranslationReporting_report_visitDimension1_segmented_visitor_log.png
-CustomTranslationReporting_report_visitDimension2.png
-CustomTranslationReporting_report_actionDimension3_row_evolution.png
-CustomTranslationReporting_report_actionDimension3_segmented_visitor_log.png
-CustomTranslationReporting_report_actionDimension4.png
-CustomTranslationReporting_report_customReports3_row_evolution.png
-CustomTranslationReporting_report_customReports3_segmented_visitor_log.png
-CustomTranslationReporting_report_customReports3_flat.png
-CustomTranslationReporting_report_customReports5.png
-CustomTranslationReporting_report_customReports6.png
-CustomTranslationReporting_report_customReports7.png
-CustomTranslationReporting_menu_loaded_dashboards.png
-CustomTranslationReporting_menu_loaded_dashboards.png
-CustomTranslationReporting_menu_loaded_dashboards.png
-CustomTranslationReporting_manage_custom_reports_admin.png
-CustomTranslationReporting_menu_loaded_dashboards.png
-CustomTranslationReporting_manage_custom_reports_admin.png
-CustomTranslationReporting_manage_custom_reports_admin.png
-CustomTranslationReporting_manage_custom_dimensions_admin.png