mirror of
https://github.com/klaussilveira/gitlist.git
synced 2025-11-17 11:10:57 +01:00
I have removed the directory management features from Gitter and ported them to GitList, since they are application-specific logic. I was unhappy with the way directories and multiple directories were handled, so i altered almost everything. The tests are OK, but the coverage is not good. This means that i'll need som help from all GitList users that are actively testing the development version with multiple directories. I have removed the directory caching feature for now, it will be re-implemented soon.
311 lines
14 KiB
PHP
311 lines
14 KiB
PHP
<?php
|
|
|
|
use Silex\WebTestCase;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
use GitList\Git\Client;
|
|
|
|
class InterfaceTest extends WebTestCase
|
|
{
|
|
protected static $tmpdir;
|
|
protected static $gitPath;
|
|
|
|
public static function setUpBeforeClass()
|
|
{
|
|
if (getenv('TMP')) {
|
|
self::$tmpdir = getenv('TMP');
|
|
} elseif (getenv('TMPDIR')) {
|
|
self::$tmpdir = getenv('TMPDIR');
|
|
} else {
|
|
self::$tmpdir = DIRECTORY_SEPARATOR . 'tmp';
|
|
}
|
|
|
|
self::$tmpdir .= DIRECTORY_SEPARATOR . 'gitlist_' . md5(time() . mt_rand()) . DIRECTORY_SEPARATOR;
|
|
|
|
$fs = new Filesystem();
|
|
$fs->mkdir(self::$tmpdir);
|
|
|
|
if (!is_writable(self::$tmpdir)) {
|
|
$this->markTestSkipped('There are no write permissions in order to create test repositories.');
|
|
}
|
|
|
|
$options['path'] = getenv('GIT_CLIENT') ?: '/usr/bin/git';
|
|
$options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
|
|
$options['default_branch'] = 'master';
|
|
$options['ini.file'] = "config.ini";
|
|
|
|
$cacheDir = self::$tmpdir . DIRECTORY_SEPARATOR . 'cache';
|
|
$fs->mkdir($cacheDir);
|
|
|
|
$git = new Client($options);
|
|
|
|
self::$gitPath = $options['path'];
|
|
|
|
// GitTest repository fixture
|
|
$git->createRepository(self::$tmpdir . 'GitTest');
|
|
$repository = $git->getRepository(self::$tmpdir . 'GitTest');
|
|
file_put_contents(self::$tmpdir . 'GitTest/README.md', "## GitTest\nGitTest is a *test* repository!");
|
|
file_put_contents(self::$tmpdir . 'GitTest/test.php', "<?php\necho 'Hello World'; // This is a test");
|
|
$repository->setConfig('user.name', 'Luke Skywalker');
|
|
$repository->setConfig('user.email', 'luke@rebel.org');
|
|
$repository->addAll();
|
|
$repository->commit("Initial commit");
|
|
$repository->createBranch('issue12');
|
|
$repository->createBranch('issue42');
|
|
$repository->createBranch('branch/name/wiith/slashes');
|
|
|
|
// foobar repository fixture
|
|
$git->createRepository(self::$tmpdir . 'foobar');
|
|
$repository = $git->getRepository(self::$tmpdir . 'foobar');
|
|
|
|
file_put_contents(self::$tmpdir . 'foobar/bar.json', "{\n\"name\": \"foobar\"\n}");
|
|
file_put_contents(self::$tmpdir . 'foobar/.git/description', 'This is a test repo!');
|
|
$fs->mkdir(self::$tmpdir . 'foobar/myfolder');
|
|
$fs->mkdir(self::$tmpdir . 'foobar/testfolder');
|
|
file_put_contents(self::$tmpdir . 'foobar/myfolder/mytest.php',
|
|
"<?php\necho 'Hello World'; // This is my test");
|
|
file_put_contents(self::$tmpdir . 'foobar/testfolder/test.php',
|
|
"<?php\necho 'Hello World'; // This is a test");
|
|
$repository->setConfig('user.name', 'Luke Skywalker');
|
|
$repository->setConfig('user.email', 'luke@rebel.org');
|
|
$repository->addAll();
|
|
$repository->commit("First commit");
|
|
|
|
// Nested repository fixture
|
|
$nested_dir = self::$tmpdir . 'nested/';
|
|
$fs->mkdir($nested_dir);
|
|
$git->createRepository($nested_dir . 'NestedRepo');
|
|
$repository = $git->getRepository($nested_dir . 'NestedRepo');
|
|
file_put_contents($nested_dir . 'NestedRepo/.git/description', 'This is a NESTED test repo!');
|
|
file_put_contents($nested_dir . 'NestedRepo/README.txt', 'NESTED TEST REPO README');
|
|
$repository->setConfig('user.name', 'Luke Skywalker');
|
|
$repository->setConfig('user.email', 'luke@rebel.org');
|
|
$repository->addAll();
|
|
$repository->commit("First commit");
|
|
$repository->createBranch("testing");
|
|
$repository->checkout("testing");
|
|
file_put_contents($nested_dir . 'NestedRepo/README.txt', 'NESTED TEST BRANCH README');
|
|
$repository->addAll();
|
|
$repository->commit("Changing branch");
|
|
$repository->checkout("master");
|
|
|
|
// master-less repository fixture
|
|
$git->createRepository(self::$tmpdir . 'develop');
|
|
$repository = $git->getRepository(self::$tmpdir . 'develop');
|
|
$repository->setConfig('user.name', 'Luke Skywalker');
|
|
$repository->setConfig('user.email', 'luke@rebel.org');
|
|
file_put_contents(self::$tmpdir . 'develop/README.md', "## develop\ndevelop is a *test* repository!");
|
|
$repository->addAll();
|
|
$repository->commit("First commit");
|
|
$repository->createBranch("develop");
|
|
$repository = $repository->checkout('develop');
|
|
|
|
file_put_contents(self::$tmpdir . 'develop/test.php', "<?php\necho 'Hello World'; // This is a test");
|
|
$repository->setConfig('user.name', 'Luke Skywalker');
|
|
$repository->setConfig('user.email', 'luke@rebel.org');
|
|
$repository->addAll();
|
|
$repository->commit("Initial commit");
|
|
|
|
// Detached HEAD repository fixture
|
|
$git->createRepository(self::$tmpdir . 'detached-head');
|
|
$repository = $git->getRepository(self::$tmpdir . 'detached-head');
|
|
$repository->setConfig('user.name', 'Luke Skywalker');
|
|
$repository->setConfig('user.email', 'luke@rebel.org');
|
|
file_put_contents(self::$tmpdir . 'detached-head/README.md', "## detached head\ndetached-head is a *test* repository!");
|
|
$repository->addAll();
|
|
$repository->commit("First commit");
|
|
$repository->checkout('HEAD');
|
|
}
|
|
|
|
public function createApplication()
|
|
{
|
|
$config = new GitList\Config;
|
|
$config->set('app', 'debug', true);
|
|
$config->set('app', 'debug', false);
|
|
$config->set('git', 'client', self::$gitPath);
|
|
$config->set('git', 'default_branch', 'master');
|
|
$config->set('git', 'repositories', array(self::$tmpdir));
|
|
|
|
$app = require 'boot.php';
|
|
return $app;
|
|
}
|
|
|
|
public function testInitialPage()
|
|
{
|
|
$client = $this->createClient();
|
|
$crawler = $client->request('GET', '/');
|
|
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertCount(1, $crawler->filter('title:contains("GitList")'));
|
|
$this->assertCount(1, $crawler->filter('div.repository-header a:contains("GitTest")'));
|
|
$this->assertEquals('/GitTest/', $crawler->filter('.repository-header a')->eq(0)->attr('href'));
|
|
$this->assertEquals('/GitTest/master/rss/', $crawler->filter('.repository-header a')->eq(1)->attr('href'));
|
|
$this->assertEquals('/NestedRepo/', $crawler->filter('.repository-header a')->eq(2)->attr('href'));
|
|
$this->assertEquals('/NestedRepo/master/rss/', $crawler->filter('.repository-header a')->eq(3)->attr('href'));
|
|
$this->assertCount(1, $crawler->filter('div.repository-header:contains("foobar")'));
|
|
$this->assertCount(1, $crawler->filter('div.repository-body:contains("This is a test repo!")'));
|
|
$this->assertEquals('/foobar/', $crawler->filter('.repository-header a')->eq(8)->attr('href'));
|
|
$this->assertEquals('/foobar/master/rss/', $crawler->filter('.repository-header a')->eq(9)->attr('href'));
|
|
}
|
|
|
|
public function testRepositoryPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertCount(1, $crawler->filter('.tree tr:contains("README.md")'));
|
|
$this->assertCount(1, $crawler->filter('.tree tr:contains("test.php")'));
|
|
$this->assertCount(1, $crawler->filter('.md-header:contains("README.md")'));
|
|
$this->assertEquals("## GitTest\nGitTest is a *test* repository!", $crawler->filter('#md-content')->eq(0)->text());
|
|
$this->assertEquals('/GitTest/blob/master/README.md', $crawler->filter('.tree tr td')->eq(0)->filter('a')->eq(0)->attr('href'));
|
|
$this->assertEquals('/GitTest/blob/master/test.php', $crawler->filter('.tree tr td')->eq(3)->filter('a')->eq(0)->attr('href'));
|
|
|
|
$this->assertEquals('branch/name/wiith/slashes', $crawler->filter('.dropdown-menu li')->eq(1)->text());
|
|
$this->assertEquals('issue12', $crawler->filter('.dropdown-menu li')->eq(2)->text());
|
|
$this->assertEquals('issue42', $crawler->filter('.dropdown-menu li')->eq(3)->text());
|
|
$this->assertEquals('master', $crawler->filter('.dropdown-menu li')->eq(4)->text());
|
|
|
|
$crawler = $client->request('GET', '/foobar/');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertCount(1, $crawler->filter('.tree tr:contains("myfolder")'));
|
|
$this->assertCount(1, $crawler->filter('.tree tr:contains("testfolder")'));
|
|
$this->assertCount(1, $crawler->filter('.tree tr:contains("bar.json")'));
|
|
$this->assertEquals('/foobar/tree/master/myfolder/', $crawler->filter('.tree tr td')->eq(0)->filter('a')->eq(0)->attr('href'));
|
|
$this->assertEquals('/foobar/tree/master/testfolder/', $crawler->filter('.tree tr td')->eq(3)->filter('a')->eq(0)->attr('href'));
|
|
$this->assertEquals('/foobar/blob/master/bar.json', $crawler->filter('.tree tr td')->eq(6)->filter('a')->eq(0)->attr('href'));
|
|
$this->assertCount(0, $crawler->filter('.md-header'));
|
|
$this->assertEquals('master', $crawler->filter('.dropdown-menu li')->eq(1)->text());
|
|
}
|
|
|
|
public function testBlobPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/blob/master/test.php');
|
|
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertCount(1, $crawler->filter('.breadcrumb .active:contains("test.php")'));
|
|
$this->assertEquals('/GitTest/raw/master/test.php',
|
|
$crawler->filter('.source-header .btn-group a')->eq(0)->attr('href'));
|
|
$this->assertEquals('/GitTest/blame/master/test.php',
|
|
$crawler->filter('.source-header .btn-group a')->eq(1)->attr('href'));
|
|
$this->assertEquals('/GitTest/commits/master/test.php',
|
|
$crawler->filter('.source-header .btn-group a')->eq(2)->attr('href'));
|
|
}
|
|
|
|
public function testRawPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/raw/master/test.php');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertEquals("<?php\necho 'Hello World'; // This is a test", $client->getResponse()->getContent());
|
|
}
|
|
|
|
public function testBlamePage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/blame/master/test.php');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertCount(1, $crawler->filter('.source-header .meta:contains("test.php")'));
|
|
$this->assertRegexp('/\/GitTest\/commit\/[a-zA-Z0-9%]+/',
|
|
$crawler->filter('.blame-view .commit')->eq(0)->filter('a')->attr('href'));
|
|
|
|
$crawler = $client->request('GET', '/foobar/blame/master/bar.json');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertCount(1, $crawler->filter('.source-header .meta:contains("bar.json")'));
|
|
$this->assertRegexp('/\/foobar\/commit\/[a-zA-Z0-9%]+/',
|
|
$crawler->filter('.blame-view .commit')->eq(0)->filter('a')->attr('href'));
|
|
}
|
|
|
|
public function testHistoryPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/commits/master/test.php');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text());
|
|
|
|
$crawler = $client->request('GET', '/GitTest/commits/master/README.md');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text());
|
|
|
|
$crawler = $client->request('GET', '/foobar/commits/master/bar.json');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertEquals('First commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text());
|
|
}
|
|
|
|
public function testCommitsPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/commits');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text());
|
|
|
|
$crawler = $client->request('GET', '/foobar/commits');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertEquals('First commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text());
|
|
}
|
|
|
|
public function testStatsPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/GitTest/stats');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertRegexp('/.php: 1 files/', $crawler->filter('.table tbody')->eq(0)->text());
|
|
$this->assertRegexp('/.md: 1 files/', $crawler->filter('.table tbody')->eq(0)->text());
|
|
$this->assertRegexp('/Total files: 2/', $crawler->filter('.table tbody')->eq(0)->text());
|
|
$this->assertRegexp('/Luke Skywalker: 1 commits/', $crawler->filter('.table tbody')->eq(0)->text());
|
|
}
|
|
|
|
public function testRssPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$client->request('GET', '/GitTest/master/rss/');
|
|
$response = $client->getResponse();
|
|
|
|
$this->assertTrue($response->isOk());
|
|
$this->assertRegexp('/Latest commits in GitTest:master/', $client->getResponse()->getContent());
|
|
$this->assertRegexp('/Initial commit/', $client->getResponse()->getContent());
|
|
}
|
|
|
|
public function testNestedRepoPage()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$client->request('GET', '/NestedRepo/');
|
|
$response = $client->getResponse();
|
|
|
|
$this->assertTrue($response->isOk());
|
|
$this->assertRegexp('/NESTED TEST REPO README/', $client->getResponse()->getContent());
|
|
}
|
|
|
|
public function testDevelopRepo()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/develop/');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
}
|
|
|
|
public function testNestedRepoBranch()
|
|
{
|
|
$client = $this->createClient();
|
|
|
|
$crawler = $client->request('GET', '/NestedRepo/testing/');
|
|
$this->assertTrue($client->getResponse()->isOk());
|
|
$this->assertRegexp('/NESTED TEST BRANCH README/', $client->getResponse()->getContent());
|
|
}
|
|
|
|
public static function tearDownAfterClass()
|
|
{
|
|
$fs = new Filesystem();
|
|
$fs->remove(self::$tmpdir);
|
|
}
|
|
}
|
|
|