Parse and validate AT Protocol Lexicons with DTO generation for Laravel
1<?php
2
3namespace SocialDept\AtpSchema\Tests\Unit\Validation\Rules;
4
5use Orchestra\Testbench\TestCase;
6use SocialDept\AtpSchema\Validation\Rules\AtDatetime;
7
8class AtDatetimeTest extends TestCase
9{
10 protected AtDatetime $rule;
11
12 protected function setUp(): void
13 {
14 parent::setUp();
15
16 $this->rule = new AtDatetime();
17 }
18
19 public function test_it_validates_valid_datetime_with_z(): void
20 {
21 $valid = '2024-01-01T00:00:00Z';
22
23 $failed = false;
24 $this->rule->validate('datetime', $valid, function () use (&$failed) {
25 $failed = true;
26 });
27
28 $this->assertFalse($failed);
29 }
30
31 public function test_it_validates_datetime_with_milliseconds(): void
32 {
33 $valid = '2024-01-01T12:34:56.789Z';
34
35 $failed = false;
36 $this->rule->validate('datetime', $valid, function () use (&$failed) {
37 $failed = true;
38 });
39
40 $this->assertFalse($failed);
41 }
42
43 public function test_it_validates_various_datetime_formats(): void
44 {
45 $validDatetimes = [
46 '2024-01-01T00:00:00Z',
47 '2024-12-31T23:59:59Z',
48 '2024-06-15T12:30:45Z',
49 ];
50
51 foreach ($validDatetimes as $datetime) {
52 $failed = false;
53 $this->rule->validate('datetime', $datetime, function () use (&$failed) {
54 $failed = true;
55 });
56
57 $this->assertFalse($failed, "Expected {$datetime} to be valid");
58 }
59 }
60
61 public function test_it_rejects_invalid_datetime(): void
62 {
63 $invalid = 'not-a-datetime';
64
65 $failed = false;
66 $this->rule->validate('datetime', $invalid, function () use (&$failed) {
67 $failed = true;
68 });
69
70 $this->assertTrue($failed);
71 }
72
73 public function test_it_rejects_datetime_without_timezone(): void
74 {
75 $invalid = '2024-01-01T00:00:00';
76
77 $failed = false;
78 $this->rule->validate('datetime', $invalid, function () use (&$failed) {
79 $failed = true;
80 });
81
82 $this->assertTrue($failed);
83 }
84
85 public function test_it_rejects_non_string(): void
86 {
87 $failed = false;
88 $this->rule->validate('datetime', 123, function () use (&$failed) {
89 $failed = true;
90 });
91
92 $this->assertTrue($failed);
93 }
94}