<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[10544] sites/trunk/api.wordpress.org/public_html/events/1.0: Events: Port some tests to PHPUnit.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/10544">10544</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/10544","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>iandunn</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2020-12-23 16:56:08 +0000 (Wed, 23 Dec 2020)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Events: Port some tests to PHPUnit.

Switching to PHPUnit provides consistency with the rest of the ecosystem, removes a lot of custom code we'd otherwise have to maintain, and provides new features for free. The custom tests were originally created from scratch because of the lack of tooling available on sandboxes, but that problem can be solve with Composer.

This establishes the foundation for porting the rest of the tests in the future.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkapiwordpressorgpublic_htmlevents10indexphp">sites/trunk/api.wordpress.org/public_html/events/1.0/index.php</a></li>
<li><a href="#sitestrunkapiwordpressorgpublic_htmlevents10teststestindexphp">sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#sitestrunkapiwordpressorgpublic_htmlevents10teststestindexphpunitphp">sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index-phpunit.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkapiwordpressorgpublic_htmlevents10indexphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/api.wordpress.org/public_html/events/1.0/index.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/api.wordpress.org/public_html/events/1.0/index.php    2020-12-23 16:56:01 UTC (rev 10543)
+++ sites/trunk/api.wordpress.org/public_html/events/1.0/index.php      2020-12-23 16:56:08 UTC (rev 10544)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,4 +1,5 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px"> namespace Dotorg\API\Events;
</span><span class="cx" style="display: block; padding: 0 10px"> use stdClass;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -45,7 +46,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">        define( 'COVID_IMPACT_EXPIRATION', strtotime( 'June 30 2021' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // The test suite just needs the functions defined and doesn't want any headers or output
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( defined( 'RUNNING_TESTS' ) && RUNNING_TESTS ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if (
+               ( defined( 'RUNNING_TESTS' ) && RUNNING_TESTS ) ||
+               ( defined( 'WPORG_RUNNING_TESTS' ) && WPORG_RUNNING_TESTS )
+       ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 disable_caching();
</span><span class="cx" style="display: block; padding: 0 10px">                return;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -110,7 +114,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">        require_once $base_dir . '/includes/hyperdb/bb-10-hyper-db.php';
</span><span class="cx" style="display: block; padding: 0 10px">        require_once $base_dir . '/includes/wp-json-encode.php';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! defined( 'RUNNING_TESTS' ) || ! RUNNING_TESTS ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if (
+               ( ! defined( 'RUNNING_TESTS' ) || ! RUNNING_TESTS ) ||
+               ( ! defined( 'WPORG_RUNNING_TESTS' ) || ! WPORG_RUNNING_TESTS )
+       ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 require_once $base_dir . '/includes/object-cache.php';
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="sitestrunkapiwordpressorgpublic_htmlevents10teststestindexphpunitphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index-phpunit.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index-phpunit.php                         (rev 0)
+++ sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index-phpunit.php   2020-12-23 16:56:08 UTC (rev 10544)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,121 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+namespace Dotorg\API\Events\Tests;
+use PHPUnit\Framework\TestCase;
+use function Dotorg\API\Events\{ get_events };
+
+/**
+ * @group events
+ */
+class Test_Events extends TestCase {
+       public static function setUpBeforeClass() : void {
+               require_once dirname( __DIR__ ) . '/index.php';
+       }
+
+       /**
+        * @covers ::get_events
+        *
+        * @group unit
+        *
+        * @dataProvider data_get_events
+        */
+       function test_get_events( array $input, array $expected ) : void {
+               $actual_result = get_events( $input );
+
+               $this->assertSame( $expected['count'], count( $actual_result ) );
+               $this->assertNotEmpty( $actual_result[0]['url'] );
+               $this->assertGreaterThan( time() - ( 2 * 24 * 60 * 60 ), strtotime( $actual_result[0]['date'] ) );
+               $this->assertSame( $expected['country'], strtoupper( $actual_result[0]['location']['country'] ) );
+       }
+
+       function data_get_events() : array {
+               $cases = array(
+                       // This assumes there will always be at least 2 upcoming events, so it needs to be a very active community.
+                       '2-near-seattle' => array(
+                               'input' => array(
+                                       'number' => '2',
+                                       'nearby' => array(
+                                               'latitude'  => '47.609023',
+                                               'longitude' => '-122.335903',
+                                       ),
+                               ),
+                               'expected' => array(
+                                       'count'   => 2,
+                                       'country' => 'US',
+                               ),
+                       ),
+
+                       '1-in-australia' => array(
+                               'input' => array(
+                                       'number'  => '1',
+                                       'country' => 'AU',
+                                       'restrict_by_country' => true,
+                               ),
+                               'expected' => array(
+                                       'count'   => 1,
+                                       'country' => 'AU',
+                               ),
+                       ),
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @covers ::get_events
+        *
+        * @group unit
+        *
+        * @dataProvider data_get_events_country_restriction
+        */
+       function test_get_events_country_restriction( array $input, array $expected_countries ) : void {
+               $actual_result    = get_events( $input );
+               $actual_countries = array_column( array_column( $actual_result, 'location' ), 'country' );
+               $actual_countries = array_unique( array_map( 'strtoupper', $actual_countries ) );
+
+               sort( $actual_countries );
+
+               $this->assertSame( $actual_countries, $expected_countries );
+       }
+
+       function data_get_events_country_restriction() : array {
+               return array(
+                       'restricted-by-country' => array(
+                               'input' => array(
+                                       'number'              => '500',
+                                       'country'             => 'CA',
+                                       'restrict_by_country' => true,
+                               ),
+                               'expected_countries' => array( 'CA' ),
+                       ),
+
+                       /*
+                        * This assumes there will always be at least an upcoming event on both sides of the border, so the
+                        * coordinates need to be half-way between two very active groups in different countries, where the
+                        * mid-point is less than `$event_distances['meetup']`.
+                        *
+                        * If Toronto, CA and Buffalo, US no longer work in the future, then another possible location would be
+                        * `53.997654, -6.403377` -- between Belfast, GB and Dublin, IE -- or `47.986952, -122.961350` --
+                        * between Seattle, US and Victoria, CA.
+                        *
+                        * See https://wordpress.slack.com/archives/C08M59V3P/p1524168308000202.
+                        */
+                       'not-restricted-by-country' => array(
+                               'input' => array(
+                                       'number'              => '500',
+                                       'restrict_by_country' => false,
+
+                                       'nearby' => array(
+                                               'latitude'  => '43.254372',
+                                               'longitude' => '-79.063746',
+                                       ),
+                               ),
+                               'expected_countries' => array( 'CA', 'US' ),
+                       ),
+               );
+       }
+
+       function test_port_remaining_tests() {
+               $this->markTestIncomplete( 'Not all of the tests from ./test-index.php have been ported to PHPUnit yet. See the notes in that file.' );
+       }
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index-phpunit.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkapiwordpressorgpublic_htmlevents10teststestindexphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php 2020-12-23 16:56:01 UTC (rev 10543)
+++ sites/trunk/api.wordpress.org/public_html/events/1.0/tests/test-index.php   2020-12-23 16:56:08 UTC (rev 10544)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,5 +1,12 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/*
+ * @todo Move these into proper PHPUnit tests in `tests/test-index.php` as have time.
+ *
+ * When that's done, delete this file and rename that one to `test-index.php`.
+ * Also delete the `test_port_remaining_tests()` test in the PHPUnit class.
+ */
+
</ins><span class="cx" style="display: block; padding: 0 10px"> namespace Dotorg\API\Events;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> if ( 'cli' !== php_sapi_name() ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -6,6 +13,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">        die();
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/*
+ * Don't run these tests from PHPUnit.
+ */
+if ( defined( 'WPORG_RUNNING_TESTS' ) ) {
+       return;
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px">  * Main entry point
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -19,8 +33,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $tests_failed  = 0;
</span><span class="cx" style="display: block; padding: 0 10px">        $tests_failed += test_get_location();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $tests_failed += test_get_events();
-       $tests_failed += test_get_events_country_restriction();
</del><span class="cx" style="display: block; padding: 0 10px">         $tests_failed += test_maybe_add_regional_wordcamps();
</span><span class="cx" style="display: block; padding: 0 10px">        $tests_failed += test_maybe_add_wp15_promo();
</span><span class="cx" style="display: block; padding: 0 10px">        $tests_failed += test_build_response();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -957,147 +969,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Test `get_events()`
- *
- * @return bool The number of failures
- */
-function test_get_events() {
-       $failed = 0;
-       $cases  = get_events_test_cases();
-
-       printf( "\nRunning %d events tests", count( $cases ) );
-
-       foreach ( $cases as $case_id => $case ) {
-               $actual_result = get_events( $case['input'] );
-
-               $passed = $case['expected']['count'] === count( $actual_result ) &&
-                         ! empty( $actual_result[0]['url'] ) &&
-                         strtotime( $actual_result[0]['date'] ) > time() - ( 2 * 24 * 60 * 60 ) &&
-                         $case['expected']['country'] === strtoupper( $actual_result[0]['location']['country'] );
-
-               output_results( $case_id, $passed, $case['expected'], $actual_result );
-
-               if ( ! $passed ) {
-                       $failed++;
-               }
-       }
-
-       return $failed;
-}
-
-/**
- * Get the cases for testing `get_events()`.
- *
- * @return array
- */
-function get_events_test_cases() {
-       $cases = array(
-               // This assumes there will always be at least 2 upcoming events, so it needs to be a very active community.
-               '2-near-seattle' => array(
-                       'input' => array(
-                               'number' => '2',
-                               'nearby' => array(
-                                       'latitude'  => '47.609023',
-                                       'longitude' => '-122.335903',
-                               ),
-                       ),
-                       'expected' => array(
-                               'count'   => 2,
-                               'country' => 'US',
-                       ),
-               ),
-
-               '1-in-australia' => array(
-                       'input' => array(
-                               'number'  => '1',
-                               'country' => 'AU',
-                               'restrict_by_country' => true,
-                       ),
-                       'expected' => array(
-                               'count'   => 1,
-                               'country' => 'AU',
-                       ),
-               ),
-       );
-
-       return $cases;
-}
-
-/**
- * Test `get_events()` `restricted_by_country` parameter.
- *
- * @return bool The number of failures
- */
-function test_get_events_country_restriction() {
-       $failed = 0;
-       $cases  = get_events_country_restriction_test_cases();
-
-       printf( "\nRunning %d events restrict by country tests", count( $cases ) );
-
-       foreach ( $cases as $case_id => $case ) {
-               $actual_result    = get_events( $case['input'] );
-               $actual_countries = array_column( array_column( $actual_result, 'location' ), 'country' );
-               $actual_countries = array_unique( array_map( 'strtoupper', $actual_countries ) );
-
-               sort( $actual_countries );
-
-               $passed = $actual_countries === $case['expected_countries'];
-
-               output_results( $case_id, $passed, $case['expected_countries'], $actual_countries );
-
-               if ( ! $passed ) {
-                       $failed++;
-               }
-       }
-
-       return $failed;
-}
-
-/**
- * Get the cases for testing the `get_events()` `restricted_by_country` parameter.
- *
- * @return array
- */
-function get_events_country_restriction_test_cases() {
-       $cases = array(
-               'restricted-by-country' => array(
-                       'input' => array(
-                               'number'              => '500',
-                               'country'             => 'CA',
-                               'restrict_by_country' => true,
-                       ),
-                       'expected_countries' => array( 'CA' ),
-               ),
-
-               /*
-                * This assumes there will always be at least an upcoming event on both sides of the border, so the
-                * coordinates need to be half-way between two very active groups in different countries, where the
-                * mid-point is less than `$event_distances['meetup']`.
-                *
-                * If Toronto, CA and Buffalo, US no longer work in the future, then another possible location would be
-                * `53.997654, -6.403377` -- between Belfast, GB and Dublin, IE -- or `47.986952, -122.961350` --
-                * between Seattle, US and Victoria, CA.
-                *
-                * See https://wordpress.slack.com/archives/C08M59V3P/p1524168308000202.
-                */
-               'not-restricted-by-country' => array(
-                       'input' => array(
-                               'number'              => '500',
-                               'restrict_by_country' => false,
-
-                               'nearby' => array(
-                                       'latitude'  => '43.254372',
-                                       'longitude' => '-79.063746',
-                               ),
-                       ),
-                       'expected_countries' => array( 'CA', 'US' ),
-               ),
-       );
-
-       return $cases;
-}
-
-/**
</del><span class="cx" style="display: block; padding: 0 10px">  * Test `build_response()`
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @todo It might be better to do more abstracted tests of `main()`, rather than coupling to the
</span></span></pre>
</div>
</div>

</body>
</html>