Skip to content

Commit 3c238e2

Browse files
myxiaoaoclaude
andcommitted
test: 第三阶段测试覆盖率提升,新增 62 个测试文件 (+658 tests, +1017 assertions)
覆盖 Form Fields 派生类、Traits、Grid Displayers/Tools/Actions、 Filter Presenters、Extend/Support 模块、Http 控制器/中间件、 Tree 模块、Widgets Metrics 和 Application。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2fa2c8d commit 3c238e2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+8718
-0
lines changed

tests/Unit/ApplicationTest.php

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
<?php
2+
3+
namespace Dcat\Admin\Tests\Unit;
4+
5+
use Dcat\Admin\Application;
6+
use Dcat\Admin\Tests\TestCase;
7+
use ReflectionProperty;
8+
9+
class ApplicationTest extends TestCase
10+
{
11+
protected function getProtectedProperty(object $object, string $property)
12+
{
13+
$reflection = new ReflectionProperty($object, $property);
14+
$reflection->setAccessible(true);
15+
16+
return $reflection->getValue($object);
17+
}
18+
19+
protected function setProtectedProperty(object $object, string $property, mixed $value): void
20+
{
21+
$reflection = new ReflectionProperty($object, $property);
22+
$reflection->setAccessible(true);
23+
$reflection->setValue($object, $value);
24+
}
25+
26+
public function test_constructor_sets_container(): void
27+
{
28+
$app = new Application($this->app);
29+
30+
$this->assertSame($this->app, $this->getProtectedProperty($app, 'container'));
31+
}
32+
33+
public function test_default_constant(): void
34+
{
35+
$this->assertEquals('admin', Application::DEFAULT);
36+
}
37+
38+
public function test_get_name_returns_default_when_no_name_set(): void
39+
{
40+
$app = new Application($this->app);
41+
42+
$this->assertEquals('admin', $app->getName());
43+
}
44+
45+
public function test_with_name_sets_name(): void
46+
{
47+
$app = new Application($this->app);
48+
$app->withName('backend');
49+
50+
$this->assertEquals('backend', $app->getName());
51+
}
52+
53+
public function test_get_route_prefix_with_default(): void
54+
{
55+
$app = new Application($this->app);
56+
57+
$this->assertEquals('dcat.admin.', $app->getRoutePrefix());
58+
}
59+
60+
public function test_get_route_prefix_with_custom_app(): void
61+
{
62+
$app = new Application($this->app);
63+
64+
$this->assertEquals('dcat.api.', $app->getRoutePrefix('api'));
65+
}
66+
67+
public function test_get_route_prefix_uses_current_name(): void
68+
{
69+
$app = new Application($this->app);
70+
$app->withName('dashboard');
71+
72+
$this->assertEquals('dcat.dashboard.', $app->getRoutePrefix());
73+
}
74+
75+
public function test_get_api_route_prefix_default(): void
76+
{
77+
$app = new Application($this->app);
78+
79+
$this->assertEquals('dcat.admin.dcat-api.', $app->getApiRoutePrefix());
80+
}
81+
82+
public function test_get_api_route_prefix_with_custom_app(): void
83+
{
84+
$app = new Application($this->app);
85+
86+
$this->assertEquals('dcat.backend.dcat-api.', $app->getApiRoutePrefix('backend'));
87+
}
88+
89+
public function test_get_current_api_route_prefix(): void
90+
{
91+
$app = new Application($this->app);
92+
93+
$this->assertEquals('dcat.admin.dcat-api.', $app->getCurrentApiRoutePrefix());
94+
}
95+
96+
public function test_get_current_api_route_prefix_after_name_change(): void
97+
{
98+
$app = new Application($this->app);
99+
$app->withName('dashboard');
100+
101+
$this->assertEquals('dcat.dashboard.dcat-api.', $app->getCurrentApiRoutePrefix());
102+
}
103+
104+
public function test_get_apps_returns_config(): void
105+
{
106+
$this->app['config']->set('admin.multi_app', ['api' => true, 'shop' => false]);
107+
108+
$app = new Application($this->app);
109+
$apps = $app->getApps();
110+
111+
$this->assertIsArray($apps);
112+
$this->assertArrayHasKey('api', $apps);
113+
$this->assertArrayHasKey('shop', $apps);
114+
$this->assertTrue($apps['api']);
115+
$this->assertFalse($apps['shop']);
116+
}
117+
118+
public function test_get_enabled_apps_filters_disabled(): void
119+
{
120+
$this->app['config']->set('admin.multi_app', ['api' => true, 'shop' => false]);
121+
122+
$app = new Application($this->app);
123+
$enabled = $app->getEnabledApps();
124+
125+
$this->assertArrayHasKey('api', $enabled);
126+
$this->assertArrayNotHasKey('shop', $enabled);
127+
}
128+
129+
public function test_get_apps_returns_empty_array_when_null(): void
130+
{
131+
$this->app['config']->set('admin.multi_app', null);
132+
133+
$app = new Application($this->app);
134+
$apps = $app->getApps();
135+
136+
$this->assertIsArray($apps);
137+
$this->assertEmpty($apps);
138+
}
139+
140+
public function test_get_apps_caches_result(): void
141+
{
142+
$this->app['config']->set('admin.multi_app', ['api' => true]);
143+
144+
$app = new Application($this->app);
145+
$first = $app->getApps();
146+
147+
// Change config after first call - should still return cached result
148+
$this->app['config']->set('admin.multi_app', ['api' => true, 'shop' => true]);
149+
$second = $app->getApps();
150+
151+
$this->assertSame($first, $second);
152+
$this->assertArrayNotHasKey('shop', $second);
153+
}
154+
155+
public function test_get_enabled_apps_returns_empty_when_all_disabled(): void
156+
{
157+
$this->app['config']->set('admin.multi_app', ['api' => false, 'shop' => false]);
158+
159+
$app = new Application($this->app);
160+
$enabled = $app->getEnabledApps();
161+
162+
$this->assertEmpty($enabled);
163+
}
164+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
<?php
2+
3+
namespace Dcat\Admin\Tests\Unit\Extend;
4+
5+
use Dcat\Admin\Extend\Manager;
6+
use Dcat\Admin\Extend\UpdateManager;
7+
use Dcat\Admin\Extend\VersionManager;
8+
use Dcat\Admin\Tests\TestCase;
9+
use Mockery;
10+
11+
class UpdateManagerTest extends TestCase
12+
{
13+
protected function tearDown(): void
14+
{
15+
Mockery::close();
16+
parent::tearDown();
17+
}
18+
19+
protected function createUpdateManager(?Manager $manager = null): UpdateManager
20+
{
21+
if (! $manager) {
22+
$versionManager = Mockery::mock(VersionManager::class);
23+
24+
$manager = Mockery::mock(Manager::class);
25+
$manager->shouldReceive('versionManager')->andReturn($versionManager);
26+
}
27+
28+
return new UpdateManager($manager);
29+
}
30+
31+
public function test_constructor_creates_instance(): void
32+
{
33+
$um = $this->createUpdateManager();
34+
35+
$this->assertInstanceOf(UpdateManager::class, $um);
36+
}
37+
38+
public function test_constructor_stores_manager(): void
39+
{
40+
$versionManager = Mockery::mock(VersionManager::class);
41+
42+
$manager = Mockery::mock(Manager::class);
43+
$manager->shouldReceive('versionManager')->andReturn($versionManager);
44+
45+
$um = new UpdateManager($manager);
46+
47+
$ref = new \ReflectionProperty(UpdateManager::class, 'manager');
48+
$ref->setAccessible(true);
49+
50+
$this->assertSame($manager, $ref->getValue($um));
51+
}
52+
53+
public function test_constructor_stores_version_manager(): void
54+
{
55+
$versionManager = Mockery::mock(VersionManager::class);
56+
57+
$manager = Mockery::mock(Manager::class);
58+
$manager->shouldReceive('versionManager')->andReturn($versionManager);
59+
60+
$um = new UpdateManager($manager);
61+
62+
$ref = new \ReflectionProperty(UpdateManager::class, 'versionManager');
63+
$ref->setAccessible(true);
64+
65+
$this->assertSame($versionManager, $ref->getValue($um));
66+
}
67+
68+
public function test_install_calls_update_internally(): void
69+
{
70+
$versionManager = Mockery::mock(VersionManager::class);
71+
72+
$manager = Mockery::mock(Manager::class);
73+
$manager->shouldReceive('versionManager')->andReturn($versionManager);
74+
$manager->shouldReceive('getName')->with('nonexistent')->andReturn('nonexistent');
75+
$manager->shouldReceive('get')->with('nonexistent')->andReturn(null);
76+
77+
$um = new UpdateManager($manager);
78+
79+
// install delegates to update; when extension not found, returns null
80+
$result = $um->install('nonexistent');
81+
82+
$this->assertNull($result);
83+
}
84+
85+
public function test_update_returns_null_when_extension_not_found(): void
86+
{
87+
$versionManager = Mockery::mock(VersionManager::class);
88+
89+
$manager = Mockery::mock(Manager::class);
90+
$manager->shouldReceive('versionManager')->andReturn($versionManager);
91+
$manager->shouldReceive('getName')->with('nonexistent')->andReturn('nonexistent');
92+
$manager->shouldReceive('get')->with('nonexistent')->andReturn(null);
93+
94+
$um = new UpdateManager($manager);
95+
$result = $um->update('nonexistent');
96+
97+
$this->assertNull($result);
98+
}
99+
100+
public function test_note_trait_is_available(): void
101+
{
102+
$um = $this->createUpdateManager();
103+
104+
$um->note('test note');
105+
106+
$this->assertCount(1, $um->notes);
107+
$this->assertSame('test note', $um->notes[0]);
108+
}
109+
110+
public function test_update_stores_notes(): void
111+
{
112+
$um = $this->createUpdateManager();
113+
114+
$um->note('Note 1');
115+
$um->note('Note 2');
116+
$um->note('Note 3');
117+
118+
$this->assertCount(3, $um->notes);
119+
$this->assertSame('Note 2', $um->notes[1]);
120+
}
121+
}

0 commit comments

Comments
 (0)