the browser-facing portion of osu!
at master 1.7 kB view raw
1<?php 2 3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0. 4// See the LICENCE file in the repository root for full licence text. 5 6namespace Tests; 7 8use App\Libraries\HasDynamicTable; 9use App\Models\Model; 10use File; 11use ReflectionClass; 12use Symfony\Component\Finder\SplFileInfo; 13 14class TableTest extends TestCase 15{ 16 public function testTableExistence() 17 { 18 $errors = []; 19 20 $files = File::allFiles(app_path().'/Models'); 21 foreach ($files as $file) { 22 $error = $this->checkFile($file); 23 if ($error !== null) { 24 $errors[] = $error; 25 } 26 } 27 28 // prints a diff with the classes that errored. 29 $this->assertSame([], $errors); 30 } 31 32 private function checkFile(SplFileInfo $file) 33 { 34 $class = $this->classFromFileInfo($file); 35 $reflectionClass = new ReflectionClass($class); 36 if ( 37 $reflectionClass->isAbstract() || 38 !$reflectionClass->isSubclassOf(Model::class) || 39 $reflectionClass->implementsInterface(HasDynamicTable::class) 40 ) { 41 return; 42 } 43 44 try { 45 $class::first(); 46 } catch (Exception $e) { 47 return $class; 48 } 49 } 50 51 private function classFromFileInfo(SplFileInfo $fileInfo) 52 { 53 $baseName = $fileInfo->getBasename(".{$fileInfo->getExtension()}"); 54 $namespace = str_replace('/', '\\', $fileInfo->getRelativePath()); 55 if (mb_strlen($fileInfo->getRelativePath()) !== 0) { 56 $namespace .= '\\'; 57 } 58 59 return "\\App\\Models\\{$namespace}{$baseName}"; 60 } 61}