|
12 | 12 | use Utopia\Database\Helpers\Permission; |
13 | 13 | use Utopia\Database\Helpers\Role; |
14 | 14 | use Utopia\Database\Query; |
15 | | -use Utopia\Database\Validator\Index; |
16 | 15 |
|
17 | 16 | trait SpatialTests |
18 | 17 | { |
@@ -2626,4 +2625,126 @@ public function testSpatialIndexOnNonSpatial(): void |
2626 | 2625 | $database->deleteCollection($collUpdateNull); |
2627 | 2626 | } |
2628 | 2627 | } |
| 2628 | + |
| 2629 | + public function testSpatialDocOrder(): void |
| 2630 | + { |
| 2631 | + /** @var Database $database */ |
| 2632 | + $database = static::getDatabase(); |
| 2633 | + if (!$database->getAdapter()->getSupportForSpatialAttributes()) { |
| 2634 | + $this->markTestSkipped('Adapter does not support spatial attributes'); |
| 2635 | + } |
| 2636 | + |
| 2637 | + $collectionName = 'test_spatial_order_axis'; |
| 2638 | + // Create collection first |
| 2639 | + $database->createCollection($collectionName); |
| 2640 | + |
| 2641 | + // Create spatial attributes using createAttribute method |
| 2642 | + $this->assertEquals(true, $database->createAttribute($collectionName, 'pointAttr', Database::VAR_POINT, 0, $database->getAdapter()->getSupportForSpatialIndexNull() ? false : true)); |
| 2643 | + |
| 2644 | + // Create test document |
| 2645 | + $doc1 = new Document( |
| 2646 | + [ |
| 2647 | + '$id' => 'doc1', |
| 2648 | + 'pointAttr' => [5.0, 5.5], |
| 2649 | + '$permissions' => [Permission::update(Role::any()), Permission::read(Role::any())] |
| 2650 | + ] |
| 2651 | + ); |
| 2652 | + $database->createDocument($collectionName, $doc1); |
| 2653 | + |
| 2654 | + $result = $database->getDocument($collectionName, 'doc1'); |
| 2655 | + $this->assertEquals($result->getAttribute('pointAttr')[0], 5.0); |
| 2656 | + $this->assertEquals($result->getAttribute('pointAttr')[1], 5.5); |
| 2657 | + $database->deleteCollection($collectionName); |
| 2658 | + } |
| 2659 | + |
| 2660 | + public function testInvalidCoordinateDocuments(): void |
| 2661 | + { |
| 2662 | + /** @var Database $database */ |
| 2663 | + $database = static::getDatabase(); |
| 2664 | + if (!$database->getAdapter()->getSupportForSpatialAttributes()) { |
| 2665 | + $this->markTestSkipped('Adapter does not support spatial attributes'); |
| 2666 | + } |
| 2667 | + |
| 2668 | + $collectionName = 'test_invalid_coord_'; |
| 2669 | + try { |
| 2670 | + $database->createCollection($collectionName); |
| 2671 | + |
| 2672 | + $database->createAttribute($collectionName, 'pointAttr', Database::VAR_POINT, 0, true); |
| 2673 | + $database->createAttribute($collectionName, 'lineAttr', Database::VAR_LINESTRING, 0, true); |
| 2674 | + $database->createAttribute($collectionName, 'polyAttr', Database::VAR_POLYGON, 0, true); |
| 2675 | + |
| 2676 | + $invalidDocs = [ |
| 2677 | + // Invalid POINT (longitude > 180) |
| 2678 | + [ |
| 2679 | + '$id' => 'invalidDoc1', |
| 2680 | + 'pointAttr' => [200.0, 20.0], |
| 2681 | + 'lineAttr' => [[1.0, 2.0], [3.0, 4.0]], |
| 2682 | + 'polyAttr' => [ |
| 2683 | + [ |
| 2684 | + [0.0, 0.0], |
| 2685 | + [0.0, 10.0], |
| 2686 | + [10.0, 10.0], |
| 2687 | + [10.0, 0.0], |
| 2688 | + [0.0, 0.0] |
| 2689 | + ] |
| 2690 | + ] |
| 2691 | + ], |
| 2692 | + // Invalid POINT (latitude < -90) |
| 2693 | + [ |
| 2694 | + '$id' => 'invalidDoc2', |
| 2695 | + 'pointAttr' => [50.0, -100.0], |
| 2696 | + 'lineAttr' => [[1.0, 2.0], [3.0, 4.0]], |
| 2697 | + 'polyAttr' => [ |
| 2698 | + [ |
| 2699 | + [0.0, 0.0], |
| 2700 | + [0.0, 10.0], |
| 2701 | + [10.0, 10.0], |
| 2702 | + [10.0, 0.0], |
| 2703 | + [0.0, 0.0] |
| 2704 | + ] |
| 2705 | + ] |
| 2706 | + ], |
| 2707 | + // Invalid LINESTRING (point outside valid range) |
| 2708 | + [ |
| 2709 | + '$id' => 'invalidDoc3', |
| 2710 | + 'pointAttr' => [50.0, 20.0], |
| 2711 | + 'lineAttr' => [[1.0, 2.0], [300.0, 4.0]], // invalid longitude in line |
| 2712 | + 'polyAttr' => [ |
| 2713 | + [ |
| 2714 | + [0.0, 0.0], |
| 2715 | + [0.0, 10.0], |
| 2716 | + [10.0, 10.0], |
| 2717 | + [10.0, 0.0], |
| 2718 | + [0.0, 0.0] |
| 2719 | + ] |
| 2720 | + ] |
| 2721 | + ], |
| 2722 | + // Invalid POLYGON (point outside valid range) |
| 2723 | + [ |
| 2724 | + '$id' => 'invalidDoc4', |
| 2725 | + 'pointAttr' => [50.0, 20.0], |
| 2726 | + 'lineAttr' => [[1.0, 2.0], [3.0, 4.0]], |
| 2727 | + 'polyAttr' => [ |
| 2728 | + [ |
| 2729 | + [0.0, 0.0], |
| 2730 | + [0.0, 10.0], |
| 2731 | + [190.0, 10.0], // invalid longitude |
| 2732 | + [10.0, 0.0], |
| 2733 | + [0.0, 0.0] |
| 2734 | + ] |
| 2735 | + ] |
| 2736 | + ], |
| 2737 | + ]; |
| 2738 | + foreach ($invalidDocs as $docData) { |
| 2739 | + $this->expectException(StructureException::class); |
| 2740 | + $docData['$permissions'] = [Permission::update(Role::any()), Permission::read(Role::any())]; |
| 2741 | + $doc = new Document($docData); |
| 2742 | + $database->createDocument($collectionName, $doc); |
| 2743 | + } |
| 2744 | + |
| 2745 | + |
| 2746 | + } finally { |
| 2747 | + $database->deleteCollection($collectionName); |
| 2748 | + } |
| 2749 | + } |
2629 | 2750 | } |
0 commit comments