| 
5 | 5 | use GraphQL\Language\AST\DocumentNode;  | 
6 | 6 | use GraphQL\Language\AST\FieldDefinitionNode;  | 
7 | 7 | use GraphQL\Language\AST\FieldNode;  | 
 | 8 | +use GraphQL\Language\AST\InlineFragmentNode;  | 
8 | 9 | use GraphQL\Language\AST\InputObjectTypeDefinitionNode;  | 
9 | 10 | use GraphQL\Language\AST\InputValueDefinitionNode;  | 
10 | 11 | use GraphQL\Language\AST\NameNode;  | 
@@ -1732,4 +1733,142 @@ public function testAncestorsForObjectTypeDefinition(): void  | 
1732 | 1733 |             ],  | 
1733 | 1734 |         ]);  | 
1734 | 1735 |     }  | 
 | 1736 | + | 
 | 1737 | +    public function testAllowsReplacingNodeWithNodeList(): void  | 
 | 1738 | +    {  | 
 | 1739 | +        $ast = Parser::parse('  | 
 | 1740 | +            {  | 
 | 1741 | +                field1  | 
 | 1742 | +                ... on Type {  | 
 | 1743 | +                    field2  | 
 | 1744 | +                    field3  | 
 | 1745 | +                }  | 
 | 1746 | +                field4  | 
 | 1747 | +            }  | 
 | 1748 | +        ', ['noLocation' => true]);  | 
 | 1749 | + | 
 | 1750 | +        $editedAst = Visitor::visit(  | 
 | 1751 | +            $ast,  | 
 | 1752 | +            [  | 
 | 1753 | +                NodeKind::INLINE_FRAGMENT => [  | 
 | 1754 | +                    'leave' => fn (InlineFragmentNode $node): NodeList => $node->selectionSet->selections,  | 
 | 1755 | +                ],  | 
 | 1756 | +            ]  | 
 | 1757 | +        );  | 
 | 1758 | + | 
 | 1759 | +        $expected = Parser::parse('  | 
 | 1760 | +            {  | 
 | 1761 | +                field1  | 
 | 1762 | +                field2  | 
 | 1763 | +                field3  | 
 | 1764 | +                field4  | 
 | 1765 | +            }  | 
 | 1766 | +        ', ['noLocation' => true]);  | 
 | 1767 | + | 
 | 1768 | +        self::assertEquals($expected, $editedAst);  | 
 | 1769 | +    }  | 
 | 1770 | + | 
 | 1771 | +    public function testAllowsReplacingNodeWithNodeListOnEnter(): void  | 
 | 1772 | +    {  | 
 | 1773 | +        $ast = Parser::parse('  | 
 | 1774 | +            {  | 
 | 1775 | +                field1  | 
 | 1776 | +                ... on Type {  | 
 | 1777 | +                    field2  | 
 | 1778 | +                    field3  | 
 | 1779 | +                }  | 
 | 1780 | +                field4  | 
 | 1781 | +            }  | 
 | 1782 | +        ', ['noLocation' => true]);  | 
 | 1783 | + | 
 | 1784 | +        $editedAst = Visitor::visit(  | 
 | 1785 | +            $ast,  | 
 | 1786 | +            [  | 
 | 1787 | +                NodeKind::INLINE_FRAGMENT => fn (InlineFragmentNode $node): NodeList => $node->selectionSet->selections,  | 
 | 1788 | +            ]  | 
 | 1789 | +        );  | 
 | 1790 | + | 
 | 1791 | +        $expected = Parser::parse('  | 
 | 1792 | +            {  | 
 | 1793 | +                field1  | 
 | 1794 | +                field2  | 
 | 1795 | +                field3  | 
 | 1796 | +                field4  | 
 | 1797 | +            }  | 
 | 1798 | +        ', ['noLocation' => true]);  | 
 | 1799 | + | 
 | 1800 | +        self::assertEquals($expected, $editedAst);  | 
 | 1801 | +    }  | 
 | 1802 | + | 
 | 1803 | +    public function testThrowsExceptionWhenAddingNonNodeToNodeList(): void  | 
 | 1804 | +    {  | 
 | 1805 | +        $ast = Parser::parse('  | 
 | 1806 | +            {  | 
 | 1807 | +                field1  | 
 | 1808 | +                ... on Type {  | 
 | 1809 | +                    field2  | 
 | 1810 | +                }  | 
 | 1811 | +            }  | 
 | 1812 | +        ', ['noLocation' => true]);  | 
 | 1813 | + | 
 | 1814 | +        self::expectException(\Exception::class);  | 
 | 1815 | +        self::expectExceptionMessage('Can only add Node or NodeList to NodeList, got: "invalid string value"');  | 
 | 1816 | + | 
 | 1817 | +        Visitor::visit(  | 
 | 1818 | +            $ast,  | 
 | 1819 | +            [  | 
 | 1820 | +                NodeKind::INLINE_FRAGMENT => [  | 
 | 1821 | +                    'leave' => fn (InlineFragmentNode $node) => 'invalid string value',  | 
 | 1822 | +                ],  | 
 | 1823 | +            ]  | 
 | 1824 | +        );  | 
 | 1825 | +    }  | 
 | 1826 | + | 
 | 1827 | +    public function testThrowsExceptionWhenAddingArrayToNodeList(): void  | 
 | 1828 | +    {  | 
 | 1829 | +        $ast = Parser::parse('  | 
 | 1830 | +            {  | 
 | 1831 | +                field1  | 
 | 1832 | +                ... on Type {  | 
 | 1833 | +                    field2  | 
 | 1834 | +                }  | 
 | 1835 | +            }  | 
 | 1836 | +        ', ['noLocation' => true]);  | 
 | 1837 | + | 
 | 1838 | +        self::expectException(\Exception::class);  | 
 | 1839 | +        self::expectExceptionMessage('Can only add Node or NodeList to NodeList, got:');  | 
 | 1840 | + | 
 | 1841 | +        Visitor::visit(  | 
 | 1842 | +            $ast,  | 
 | 1843 | +            [  | 
 | 1844 | +                NodeKind::INLINE_FRAGMENT => [  | 
 | 1845 | +                    'leave' => fn (InlineFragmentNode $node) => ['invalid', 'array'],  | 
 | 1846 | +                ],  | 
 | 1847 | +            ]  | 
 | 1848 | +        );  | 
 | 1849 | +    }  | 
 | 1850 | + | 
 | 1851 | +    public function testThrowsExceptionWhenAddingIntegerToNodeList(): void  | 
 | 1852 | +    {  | 
 | 1853 | +        $ast = Parser::parse('  | 
 | 1854 | +            {  | 
 | 1855 | +                field1  | 
 | 1856 | +                ... on Type {  | 
 | 1857 | +                    field2  | 
 | 1858 | +                }  | 
 | 1859 | +            }  | 
 | 1860 | +        ', ['noLocation' => true]);  | 
 | 1861 | + | 
 | 1862 | +        self::expectException(\Exception::class);  | 
 | 1863 | +        self::expectExceptionMessage('Can only add Node or NodeList to NodeList, got: 42');  | 
 | 1864 | + | 
 | 1865 | +        Visitor::visit(  | 
 | 1866 | +            $ast,  | 
 | 1867 | +            [  | 
 | 1868 | +                NodeKind::INLINE_FRAGMENT => [  | 
 | 1869 | +                    'leave' => fn (InlineFragmentNode $node) => 42,  | 
 | 1870 | +                ],  | 
 | 1871 | +            ]  | 
 | 1872 | +        );  | 
 | 1873 | +    }  | 
1735 | 1874 | }  | 
0 commit comments