Differential D15448 Diff 37239 src/applications/nuance/github/__tests__/NuanceGitHubRawEventTestCase.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/nuance/github/__tests__/NuanceGitHubRawEventTestCase.php
- This file was added.
| <?php | |||||
| final class NuanceGitHubRawEventTestCase | |||||
| extends PhabricatorTestCase { | |||||
| public function testIssueEvents() { | |||||
| $path = dirname(__FILE__).'/issueevents/'; | |||||
| $cases = $this->readTestCases($path); | |||||
| foreach ($cases as $name => $info) { | |||||
| $input = $info['input']; | |||||
| $expect = $info['expect']; | |||||
| $event = NuanceGitHubRawEvent::newEvent( | |||||
| NuanceGitHubRawEvent::TYPE_ISSUE, | |||||
| $input); | |||||
| $this->assertGitHubRawEventParse($expect, $event, $name); | |||||
| } | |||||
| } | |||||
| public function testRepositoryEvents() { | |||||
| $path = dirname(__FILE__).'/repositoryevents/'; | |||||
| $cases = $this->readTestCases($path); | |||||
| foreach ($cases as $name => $info) { | |||||
| $input = $info['input']; | |||||
| $expect = $info['expect']; | |||||
| $event = NuanceGitHubRawEvent::newEvent( | |||||
| NuanceGitHubRawEvent::TYPE_REPOSITORY, | |||||
| $input); | |||||
| $this->assertGitHubRawEventParse($expect, $event, $name); | |||||
| } | |||||
| } | |||||
| private function assertGitHubRawEventParse( | |||||
| array $expect, | |||||
| NuanceGitHubRawEvent $event, | |||||
| $name) { | |||||
| $actual = array( | |||||
| 'repository.name.full' => $event->getRepositoryFullName(), | |||||
| 'is.issue' => $event->isIssueEvent(), | |||||
| 'is.pull' => $event->isPullRequestEvent(), | |||||
| 'issue.number' => $event->getIssueNumber(), | |||||
| 'pull.number' => $event->getPullRequestNumber(), | |||||
| ); | |||||
| // Only verify the keys which are actually present in the test. This | |||||
| // allows tests to specify only relevant keys. | |||||
| $actual = array_select_keys($actual, array_keys($expect)); | |||||
| ksort($expect); | |||||
| ksort($actual); | |||||
| $this->assertEqual($expect, $actual, $name); | |||||
| } | |||||
| private function readTestCases($path) { | |||||
| $files = Filesystem::listDirectory($path, $include_hidden = false); | |||||
| $tests = array(); | |||||
| foreach ($files as $file) { | |||||
| $data = Filesystem::readFile($path.$file); | |||||
| $parts = preg_split('/^~{5,}$/m', $data); | |||||
| if (count($parts) < 2) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Expected test file "%s" to contain an input section in JSON, '. | |||||
| 'then an expected result section in JSON, with the two sections '. | |||||
| 'separated by a line of "~~~~~", but the divider is not present '. | |||||
| 'in the file.', | |||||
| $file)); | |||||
| } else if (count($parts) > 2) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Expected test file "%s" to contain exactly two sections, '. | |||||
| 'but it has more than two sections.')); | |||||
| } | |||||
| list($input, $expect) = $parts; | |||||
| try { | |||||
| $input = phutil_json_decode($input); | |||||
| $expect = phutil_json_decode($expect); | |||||
| } catch (Exception $ex) { | |||||
| throw new PhutilProxyException( | |||||
| pht( | |||||
| 'Exception while decoding test data for test "%s".', | |||||
| $file), | |||||
| $ex); | |||||
| } | |||||
| $tests[$file] = array( | |||||
| 'input' => $input, | |||||
| 'expect' => $expect, | |||||
| ); | |||||
| } | |||||
| return $tests; | |||||
| } | |||||
| } | |||||