Browse Source

Add support for defining assertions on expected lock files to integration tests

Nils Adermann 12 years ago
parent
commit
050439a0d3
1 changed files with 23 additions and 2 deletions
  1. 23 2
      tests/Composer/Test/InstallerTest.php

+ 23 - 2
tests/Composer/Test/InstallerTest.php

@@ -123,7 +123,7 @@ class InstallerTest extends TestCase
     /**
      * @dataProvider getIntegrationTests
      */
-    public function testIntegration($file, $message, $condition, $composerConfig, $lock, $installed, $installedDev, $run, $expect)
+    public function testIntegration($file, $message, $condition, $composerConfig, $lock, $installed, $installedDev, $run, $expectLock, $expect)
     {
         if ($condition) {
             eval('$res = '.$condition.';');
@@ -170,6 +170,17 @@ class InstallerTest extends TestCase
             ->method('exists')
             ->will($this->returnValue(true));
 
+        if ($expectLock) {
+            $actualLock = array();
+            $lockJsonMock->expects($this->atLeastOnce())
+                ->method('write')
+                ->will($this->returnCallback(function ($hash, $options) use (&$actualLock) {
+                    // need to do assertion outside of mock for nice phpunit output
+                    // so store value temporarily in reference for later assetion
+                    $actualLock = $hash;
+                }));
+        }
+
         $locker = new Locker($lockJsonMock, $repositoryManager, $composer->getInstallationManager(), md5(json_encode($composerConfig)));
         $composer->setLocker($locker);
 
@@ -208,6 +219,11 @@ class InstallerTest extends TestCase
         fseek($appOutput, 0);
         $this->assertEquals(0, $result, $output . stream_get_contents($appOutput));
 
+        if ($expectLock) {
+            unset($actualLock['hash']);
+            $this->assertEquals($expectLock, $actualLock);
+        }
+
         $installationManager = $composer->getInstallationManager();
         $this->assertSame($expect, implode("\n", $installationManager->getTrace()));
     }
@@ -233,12 +249,14 @@ class InstallerTest extends TestCase
                 (?:--INSTALLED--\s*(?P<installed>'.$content.'))?\s*
                 (?:--INSTALLED:DEV--\s*(?P<installedDev>'.$content.'))?\s*
                 --RUN--\s*(?P<run>.*?)\s*
+                (?:--EXPECT-LOCK--\s*(?P<expectLock>'.$content.'))?\s*
                 --EXPECT--\s*(?P<expect>.*?)\s*
             $}xs';
 
             $installed = array();
             $installedDev = array();
             $lock = array();
+            $expectLock = array();
 
             if (preg_match($pattern, $test, $match)) {
                 try {
@@ -258,6 +276,9 @@ class InstallerTest extends TestCase
                         $installedDev = JsonFile::parseJson($match['installedDev']);
                     }
                     $run = $match['run'];
+                    if (!empty($match['expectLock'])) {
+                        $expectLock = JsonFile::parseJson($match['expectLock']);
+                    }
                     $expect = $match['expect'];
                 } catch (\Exception $e) {
                     die(sprintf('Test "%s" is not valid: '.$e->getMessage(), str_replace($fixturesDir.'/', '', $file)));
@@ -266,7 +287,7 @@ class InstallerTest extends TestCase
                 die(sprintf('Test "%s" is not valid, did not match the expected format.', str_replace($fixturesDir.'/', '', $file)));
             }
 
-            $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $composer, $lock, $installed, $installedDev, $run, $expect);
+            $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $composer, $lock, $installed, $installedDev, $run, $expectLock, $expect);
         }
 
         return $tests;