|
9 | 9 |
|
10 | 10 | final class ModelLexerTest extends TestCase
|
11 | 11 | {
|
12 |
| - /** |
13 |
| - * @var ModelLexer |
14 |
| - */ |
15 |
| - private $subject; |
| 12 | + private ModelLexer $subject; |
16 | 13 |
|
17 | 14 | protected function setUp(): void
|
18 | 15 | {
|
@@ -653,6 +650,98 @@ public function it_sets_meta_data(): void
|
653 | 650 | $this->assertCount(0, $model->relationships());
|
654 | 651 | }
|
655 | 652 |
|
| 653 | + #[Test] |
| 654 | + public function it_infers_belongsTo_columns(): void |
| 655 | + { |
| 656 | + $tokens = [ |
| 657 | + 'models' => [ |
| 658 | + 'Conference' => [ |
| 659 | + 'venue_id' => 'unsigned bigInteger', |
| 660 | + 'relationships' => [ |
| 661 | + 'belongsTo' => 'Venue, Region, \\App\\Models\\User', |
| 662 | + ], |
| 663 | + ], |
| 664 | + ], |
| 665 | + ]; |
| 666 | + |
| 667 | + $actual = $this->subject->analyze($tokens); |
| 668 | + |
| 669 | + $this->assertIsArray($actual['models']); |
| 670 | + $this->assertCount(1, $actual['models']); |
| 671 | + |
| 672 | + $model = $actual['models']['Conference']; |
| 673 | + $this->assertEquals('Conference', $model->name()); |
| 674 | + $this->assertArrayHasKey('belongsTo', $model->relationships()); |
| 675 | + $this->assertTrue($model->usesTimestamps()); |
| 676 | + |
| 677 | + $columns = $model->columns(); |
| 678 | + $this->assertCount(4, $columns); |
| 679 | + $this->assertEquals('id', $columns['id']->name()); |
| 680 | + $this->assertEquals('id', $columns['id']->dataType()); |
| 681 | + $this->assertEquals([], $columns['id']->modifiers()); |
| 682 | + $this->assertEquals('venue_id', $columns['venue_id']->name()); |
| 683 | + $this->assertEquals('id', $columns['venue_id']->dataType()); |
| 684 | + $this->assertEquals(['unsigned'], $columns['venue_id']->modifiers()); |
| 685 | + $this->assertEquals(['Venue'], $columns['venue_id']->attributes()); |
| 686 | + $this->assertEquals('region_id', $columns['region_id']->name()); |
| 687 | + $this->assertEquals('id', $columns['region_id']->dataType()); |
| 688 | + $this->assertEquals([], $columns['region_id']->modifiers()); |
| 689 | + $this->assertEquals([], $columns['region_id']->attributes()); |
| 690 | + $this->assertEquals('user_id', $columns['user_id']->name()); |
| 691 | + $this->assertEquals('id', $columns['user_id']->dataType()); |
| 692 | + $this->assertEquals([], $columns['user_id']->modifiers()); |
| 693 | + |
| 694 | + $relationships = $model->relationships(); |
| 695 | + $this->assertCount(1, $relationships); |
| 696 | + $this->assertEquals(['Venue', 'Region', '\\App\\Models\\User'], $relationships['belongsTo']); |
| 697 | + } |
| 698 | + |
| 699 | + #[Test] |
| 700 | + public function it_handles_relationship_aliases(): void |
| 701 | + { |
| 702 | + $tokens = [ |
| 703 | + 'models' => [ |
| 704 | + 'Salesman' => [ |
| 705 | + 'customer_id' => 'id', |
| 706 | + 'company_id' => 'id:Organization', |
| 707 | + 'relationships' => [ |
| 708 | + 'belongsTo' => 'User:Lead, Client:Customer', |
| 709 | + ], |
| 710 | + ], |
| 711 | + ], |
| 712 | + ]; |
| 713 | + |
| 714 | + $actual = $this->subject->analyze($tokens); |
| 715 | + |
| 716 | + $this->assertIsArray($actual['models']); |
| 717 | + $this->assertCount(1, $actual['models']); |
| 718 | + |
| 719 | + $model = $actual['models']['Salesman']; |
| 720 | + $this->assertEquals('Salesman', $model->name()); |
| 721 | + $this->assertArrayHasKey('belongsTo', $model->relationships()); |
| 722 | + $this->assertTrue($model->usesTimestamps()); |
| 723 | + |
| 724 | + $columns = $model->columns(); |
| 725 | + $this->assertCount(4, $columns); |
| 726 | + $this->assertEquals('id', $columns['id']->name()); |
| 727 | + $this->assertEquals('id', $columns['id']->dataType()); |
| 728 | + $this->assertEquals([], $columns['id']->modifiers()); |
| 729 | + $this->assertEquals('customer_id', $columns['customer_id']->name()); |
| 730 | + $this->assertEquals('id', $columns['customer_id']->dataType()); |
| 731 | + $this->assertEquals([], $columns['customer_id']->modifiers()); |
| 732 | + $this->assertEquals('company_id', $columns['company_id']->name()); |
| 733 | + $this->assertEquals('id', $columns['company_id']->dataType()); |
| 734 | + $this->assertEquals([], $columns['company_id']->modifiers()); |
| 735 | + $this->assertEquals('lead_id', $columns['lead_id']->name()); |
| 736 | + $this->assertEquals('id', $columns['lead_id']->dataType()); |
| 737 | + $this->assertEquals([], $columns['lead_id']->modifiers()); |
| 738 | + $this->assertEquals(['User'], $columns['lead_id']->attributes()); |
| 739 | + |
| 740 | + $relationships = $model->relationships(); |
| 741 | + $this->assertCount(1, $relationships); |
| 742 | + $this->assertEquals(['User:Lead', 'Client:Customer', 'Organization:company_id'], $relationships['belongsTo']); |
| 743 | + } |
| 744 | + |
656 | 745 | public static function dataTypeAttributesDataProvider(): array
|
657 | 746 | {
|
658 | 747 | return [
|
|
0 commit comments