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}