From ef591e7ee21435da9314c5f7f6ea983c6f423898 Mon Sep 17 00:00:00 2001
From: Guillaume Virlet <github@virlet.org>
Date: Wed, 2 Sep 2015 13:55:39 +0200
Subject: Url: introduce global helper functions for cleanup and scheme
 detection

Relates to #314 & #326

Additions:
 - add global `cleanup_url()` and `get_url_scheme()` functions

Modifications:
 - replace `Url` usage in `index.php` by calls to global functions
 - fix `Url` tests not being run: PHPUnit expects a single test class per file
   - move classes to separate files
---
 tests/Url/CleanupUrlTest.php   |  76 +++++++++++++++++++++
 tests/Url/GetUrlSchemeTest.php |  31 +++++++++
 tests/Url/UnparseUrlTest.php   |  31 +++++++++
 tests/Url/UrlTest.php          | 148 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 286 insertions(+)
 create mode 100644 tests/Url/CleanupUrlTest.php
 create mode 100644 tests/Url/GetUrlSchemeTest.php
 create mode 100644 tests/Url/UnparseUrlTest.php
 create mode 100755 tests/Url/UrlTest.php

(limited to 'tests/Url')

diff --git a/tests/Url/CleanupUrlTest.php b/tests/Url/CleanupUrlTest.php
new file mode 100644
index 00000000..ba9a0437
--- /dev/null
+++ b/tests/Url/CleanupUrlTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Unitary tests for cleanup_url()
+ */
+
+require_once 'application/Url.php';
+
+class CleanupUrlTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Clean empty UrlThanks for building nothing
+     */
+    public function testCleanupUrlEmpty()
+    {
+        $this->assertEquals('', cleanup_url(''));
+    }
+
+    /**
+     * Clean an already cleaned Url
+     */
+    public function testCleanupUrlAlreadyClean()
+    {
+        $ref = 'http://domain.tld:3000';
+        $this->assertEquals($ref, cleanup_url($ref));
+        $ref = $ref.'/path/to/dir/';
+        $this->assertEquals($ref, cleanup_url($ref));
+    }
+
+    /**
+     * Clean Url needing cleaning
+     */
+    public function testCleanupUrlNeedClean()
+    {
+        $ref = 'http://domain.tld:3000';
+        $this->assertEquals($ref, cleanup_url($ref.'#tk.rss_all'));
+        $this->assertEquals($ref, cleanup_url($ref.'#xtor=RSS-'));
+        $this->assertEquals($ref, cleanup_url($ref.'#xtor=RSS-U3ht0tkc4b'));
+        $this->assertEquals($ref, cleanup_url($ref.'?action_object_map=junk'));
+        $this->assertEquals($ref, cleanup_url($ref.'?action_ref_map=Cr4p!'));
+        $this->assertEquals($ref, cleanup_url($ref.'?action_type_map=g4R84g3'));
+
+        $this->assertEquals($ref, cleanup_url($ref.'?fb_stuff=v41u3'));
+        $this->assertEquals($ref, cleanup_url($ref.'?fb=71m3w4573'));
+
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_campaign=zomg'));
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_medium=numnum'));
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_source=c0d3'));
+        $this->assertEquals($ref, cleanup_url($ref.'?utm_term=1n4l'));
+
+        $this->assertEquals($ref, cleanup_url($ref.'?xtor=some-url'));
+        $this->assertEquals($ref, cleanup_url($ref.'?xtor=some-url&fb=som3th1ng'));
+        $this->assertEquals($ref, cleanup_url(
+            $ref.'?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3'
+        ));
+        $this->assertEquals($ref, cleanup_url(
+            $ref.'?xtor=some-url&fb=som3th1ng#tk.rss_all'
+        ));
+
+        // ditch annoying query params and fragment, keep useful params
+        $this->assertEquals(
+            $ref.'?my=stuff&is=kept',
+            cleanup_url(
+                $ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all'
+            )
+        );
+
+        // ditch annoying query params, keep useful params and fragment
+        $this->assertEquals(
+            $ref.'?my=stuff&is=kept#again',
+            cleanup_url(
+                $ref.'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again'
+            )
+        );
+    }
+}
+
diff --git a/tests/Url/GetUrlSchemeTest.php b/tests/Url/GetUrlSchemeTest.php
new file mode 100644
index 00000000..72d80b30
--- /dev/null
+++ b/tests/Url/GetUrlSchemeTest.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Unitary tests for get_url_scheme()
+ */
+
+require_once 'application/Url.php';
+
+class GetUrlSchemeTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Get empty scheme string for empty Url
+     */
+    public function testGetUrlSchemeEmpty()
+    {
+        $this->assertEquals('', get_url_scheme(''));
+    }
+
+    /**
+     * Get normal scheme of Url
+     */
+    public function testGetUrlScheme()
+    {
+        $this->assertEquals('http', get_url_scheme('http://domain.tld:3000'));
+        $this->assertEquals('https', get_url_scheme('https://domain.tld:3000'));
+        $this->assertEquals('http', get_url_scheme('domain.tld'));
+        $this->assertEquals('ssh', get_url_scheme('ssh://domain.tld'));
+        $this->assertEquals('ftp', get_url_scheme('ftp://domain.tld'));
+        $this->assertEquals('git', get_url_scheme('git://domain.tld/push?pull=clone#checkout'));
+    }
+}
+
diff --git a/tests/Url/UnparseUrlTest.php b/tests/Url/UnparseUrlTest.php
new file mode 100644
index 00000000..edde73e4
--- /dev/null
+++ b/tests/Url/UnparseUrlTest.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Unpares Url's tests
+ */
+
+require_once 'application/Url.php';
+
+/**
+ * Unitary tests for unparse_url()
+ */
+class UnparseUrlTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Thanks for building nothing
+     */
+    public function testUnparseEmptyArray()
+    {
+        $this->assertEquals('', unparse_url(array()));
+    }
+
+    /**
+     * Rebuild a full-featured URL
+     */
+    public function testUnparseFull()
+    {
+        $ref = 'http://username:password@hostname:9090/path'
+              .'?arg1=value1&arg2=value2#anchor';
+        $this->assertEquals($ref, unparse_url(parse_url($ref)));
+    }
+}
+
diff --git a/tests/Url/UrlTest.php b/tests/Url/UrlTest.php
new file mode 100755
index 00000000..e498d79e
--- /dev/null
+++ b/tests/Url/UrlTest.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Url's tests
+ */
+
+require_once 'application/Url.php';
+
+/**
+ * Unitary tests for URL utilities
+ */
+class UrlTest extends PHPUnit_Framework_TestCase
+{
+    // base URL for tests
+    protected static $baseUrl = 'http://domain.tld:3000';
+
+    /**
+     * Helper method
+     */
+    private function assertUrlIsCleaned($query='', $fragment='')
+    {
+        $url = new Url(self::$baseUrl.$query.$fragment);
+        $url->cleanup();
+        $this->assertEquals(self::$baseUrl, $url->toString());
+    }
+
+    /**
+     * Instantiate an empty URL
+     */
+    public function testEmptyConstruct()
+    {
+        $url = new Url('');
+        $this->assertEquals('', $url->toString());
+    }
+
+    /**
+     * Instantiate a URL
+     */
+    public function testConstruct()
+    {
+        $ref = 'http://username:password@hostname:9090/path'
+              .'?arg1=value1&arg2=value2#anchor';
+        $url = new Url($ref);
+        $this->assertEquals($ref, $url->toString());
+    }
+
+    /**
+     * URL cleanup - nothing to do
+     */
+    public function testNoCleanup()
+    {
+        // URL with no query nor fragment
+        $this->assertUrlIsCleaned();
+
+        // URL with no annoying elements
+        $ref = self::$baseUrl.'?p1=val1&p2=1234#edit';
+        $url = new Url($ref);
+        $this->assertEquals($ref, $url->cleanup());
+    }
+
+    /**
+     * URL cleanup - annoying fragment
+     */
+    public function testCleanupFragment()
+    {
+        $this->assertUrlIsCleaned('', '#tk.rss_all');
+        $this->assertUrlIsCleaned('', '#xtor=RSS-');
+        $this->assertUrlIsCleaned('', '#xtor=RSS-U3ht0tkc4b');
+    }
+
+    /**
+     * URL cleanup - single annoying query parameter
+     */
+    public function testCleanupSingleQueryParam()
+    {
+        $this->assertUrlIsCleaned('?action_object_map=junk');
+        $this->assertUrlIsCleaned('?action_ref_map=Cr4p!');
+        $this->assertUrlIsCleaned('?action_type_map=g4R84g3');
+
+        $this->assertUrlIsCleaned('?fb_stuff=v41u3');
+        $this->assertUrlIsCleaned('?fb=71m3w4573');
+
+        $this->assertUrlIsCleaned('?utm_campaign=zomg');
+        $this->assertUrlIsCleaned('?utm_medium=numnum');
+        $this->assertUrlIsCleaned('?utm_source=c0d3');
+        $this->assertUrlIsCleaned('?utm_term=1n4l');
+
+        $this->assertUrlIsCleaned('?xtor=some-url');
+    }
+
+    /**
+     * URL cleanup - multiple annoying query parameters
+     */
+    public function testCleanupMultipleQueryParams()
+    {
+        $this->assertUrlIsCleaned('?xtor=some-url&fb=som3th1ng');
+        $this->assertUrlIsCleaned(
+            '?fb=stuff&utm_campaign=zomg&utm_medium=numnum&utm_source=c0d3'
+        );
+    }
+
+    /**
+     * URL cleanup - multiple annoying query parameters, annoying fragment
+     */
+    public function testCleanupMultipleQueryParamsAndFragment()
+    {
+        $this->assertUrlIsCleaned('?xtor=some-url&fb=som3th1ng', '#tk.rss_all');
+    }
+
+    /**
+     * Nominal case - the URL contains both useful and annoying parameters
+     */
+    public function testCleanupMixedContent()
+    {
+        // ditch annoying query params and fragment, keep useful params
+        $url = new Url(
+            self::$baseUrl
+            .'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#tk.rss_all'
+        );
+        $this->assertEquals(self::$baseUrl.'?my=stuff&is=kept', $url->cleanup());
+
+
+        // ditch annoying query params, keep useful params and fragment
+        $url = new Url(
+            self::$baseUrl
+            .'?fb=zomg&my=stuff&utm_medium=numnum&is=kept#again'
+        );
+        $this->assertEquals(
+            self::$baseUrl.'?my=stuff&is=kept#again',
+            $url->cleanup()
+        );
+    }
+
+    /**
+     * Test default http scheme.
+     */
+    public function testDefaultScheme() {
+        $url = new Url(self::$baseUrl);
+        $this->assertEquals('http', $url->getScheme());
+        $url = new Url('domain.tld');
+        $this->assertEquals('http', $url->getScheme());
+        $url = new Url('ssh://domain.tld');
+        $this->assertEquals('ssh', $url->getScheme());
+        $url = new Url('ftp://domain.tld');
+        $this->assertEquals('ftp', $url->getScheme());
+        $url = new Url('git://domain.tld/push?pull=clone#checkout');
+        $this->assertEquals('git', $url->getScheme());
+    }
+}
-- 
cgit v1.2.3