package fr.adrienbrault.idea.symfony2plugin.tests.doctrine.metadata.util; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.util.containers.ContainerUtil; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.dict.DoctrineManagerEnum; import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.dict.DoctrineMetadataModel; import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; import org.jetbrains.yaml.YAMLFileType; import java.io.File; import java.util.*; /** * @author Daniel Espendiller <daniel@espendiller.net> * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil */ public class DoctrineMetadataUtilTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("doctrine.odm.xml")); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("doctrine.orm.xml")); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("doctrine.orm.yml")); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("classes.php")); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#findMetadataFiles */ public void testFindMetadataFiles() { assertSize(1, DoctrineMetadataUtil.findMetadataFiles(getProject(), "Foo\\Bar")); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getModelFields */ public void testGetModelFields() { DoctrineMetadataModel modelFields = DoctrineMetadataUtil.getModelFields(getProject(), "Foo\\Bar"); assertEquals("string", modelFields.getField("foo1").getTypeName()); assertEquals("mixed", modelFields.getField("foo2").getTypeName()); assertEquals("string", modelFields.getField("foo3").getTypeName()); assertEquals("reference-one", modelFields.getField("apple1").getRelationType()); assertEquals("Foo\\Bar\\Apple", modelFields.getField("apple1").getRelation()); assertEquals("embed-one", modelFields.getField("egg1").getRelationType()); assertEquals("Foo\\Bar\\Egg", modelFields.getField("egg1").getRelation()); assertEquals("reference-many", modelFields.getField("apple2").getRelationType()); assertEquals("Foo\\Bar\\Apple", modelFields.getField("apple2").getRelation()); assertEquals("embed-many", modelFields.getField("egg2").getRelationType()); assertEquals("Foo\\Bar\\Egg", modelFields.getField("egg2").getRelation()); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getModelFields */ public void testGetOrmXmlModelFields() { DoctrineMetadataModel modelFields = DoctrineMetadataUtil.getModelFields(getProject(), "Doctrine\\Tests\\ORM\\Mapping\\XmlUser"); assertEquals("integer", modelFields.getField("id").getTypeName()); assertEquals("string", modelFields.getField("name").getTypeName()); assertEquals("string", modelFields.getField("email").getTypeName()); assertEquals("Address", modelFields.getField("address").getRelation()); assertEquals("Phonenumber", modelFields.getField("phonenumbers").getRelation()); assertEquals("Group", modelFields.getField("groups").getRelation()); assertEquals("Author", modelFields.getField("author").getRelation()); assertEquals("OneToOne", modelFields.getField("address").getRelationType()); assertEquals("OneToMany", modelFields.getField("phonenumbers").getRelationType()); assertEquals("ManyToMany", modelFields.getField("groups").getRelationType()); assertEquals("ManyToOne", modelFields.getField("author").getRelationType()); assertEquals("cms_users", modelFields.getTable()); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getModelFields */ public void testGetOrmYmlModelFields() { DoctrineMetadataModel modelFields = DoctrineMetadataUtil.getModelFields(getProject(), "Doctrine\\Tests\\ORM\\Mapping\\YamlUser"); assertEquals("integer", modelFields.getField("id").getTypeName()); assertEquals("string", modelFields.getField("name").getTypeName()); assertEquals("string", modelFields.getField("email").getTypeName()); assertEquals("Address", modelFields.getField("address").getRelation()); assertEquals("Phonenumber", modelFields.getField("phonenumbers").getRelation()); assertEquals("Group", modelFields.getField("groups").getRelation()); assertEquals("Author", modelFields.getField("author").getRelation()); assertEquals("oneToOne", modelFields.getField("address").getRelationType()); assertEquals("oneToMany", modelFields.getField("phonenumbers").getRelationType()); assertEquals("manyToMany", modelFields.getField("groups").getRelationType()); assertEquals("manyToOne", modelFields.getField("author").getRelationType()); assertEquals("foo_table", modelFields.getTable()); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getClassRepository */ public void testGetClassRepository() { assertEquals("Doctrine\\Tests\\ORM\\Mapping\\YamlUserRepository", DoctrineMetadataUtil.getClassRepository(getProject(), "Doctrine\\Tests\\ORM\\Mapping\\YamlUser").getPresentableFQN()); assertEquals("Foo\\Bar\\Repository\\FooBarRepository", DoctrineMetadataUtil.getClassRepository(getProject(), "Foo\\Bar").getPresentableFQN()); assertEquals("Foo\\Repository", DoctrineMetadataUtil.getClassRepository(getProject(), "Foo\\Car").getPresentableFQN()); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getTables */ public void testGetTables() { Map<String, PsiElement> items = new HashMap<String, PsiElement>(); Collection<Pair<String, PsiElement>> tables = DoctrineMetadataUtil.getTables(getProject()); for (Pair<String, PsiElement> pair : tables) { items.put(pair.getFirst(), pair.getSecond()); } assertContainsElements(items.keySet(), "cms_users", "foo_table"); assertNotNull(items.get("cms_users")); assertNotNull(items.get("foo_table")); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getMetadataByTable */ public void testGetMetadataByTable() { assertNotNull(DoctrineMetadataUtil.getMetadataByTable(getProject(), "cms_users").getField("id")); assertNotNull(DoctrineMetadataUtil.getMetadataByTable(getProject(), "cms_users").getField("name")); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getModels */ public void testGetModels() { Set<String> classes = new HashSet<String>(); for (PhpClass phpClass : DoctrineMetadataUtil.getModels(getProject())) { classes.add(phpClass.getPresentableFQN()); } assertContainsElements(classes, "Doctrine\\Tests\\ORM\\Mapping\\YamlUser"); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#getObjectRepositoryLookupElements */ public void testGetObjectRepositoryLookupElements() { assertNotNull(ContainerUtil.find(DoctrineMetadataUtil.getObjectRepositoryLookupElements(getProject()), new Condition<LookupElement>() { @Override public boolean value(LookupElement lookupElement) { return lookupElement.getLookupString().equals("Foo\\Bar\\Repository\\FooBarRepository"); } })); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#findManagerByScope */ public void testFindManagerByScope() { for (Pair<DoctrineManagerEnum, String> pair : Arrays.asList( Pair.create(DoctrineManagerEnum.ORM, "orm"), Pair.create(DoctrineManagerEnum.COUCHDB, "couchdb"), Pair.create(DoctrineManagerEnum.MONGODB, "mongodb"), Pair.create(DoctrineManagerEnum.ODM, "odm"), Pair.create(DoctrineManagerEnum.DOCUMENT, "document") )) { assertEquals(pair.getFirst(), DoctrineMetadataUtil.findManagerByScope(myFixture.configureByText("foo." + pair.getSecond() + ".yml", ""))); assertEquals(pair.getFirst(), DoctrineMetadataUtil.findManagerByScope(myFixture.configureByText("foo." + pair.getSecond() + ".yaml", ""))); assertEquals(pair.getFirst(), DoctrineMetadataUtil.findManagerByScope(myFixture.configureByText("foo." + pair.getSecond() + ".xml", ""))); assertEquals(pair.getFirst(), DoctrineMetadataUtil.findManagerByScope(myFixture.configureByText("foo." + pair.getSecond() + ".XML", ""))); } } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#findMetadataForRepositoryClass */ public void testFindMetadataForRepositoryClass() { Condition<VirtualFile> condition = new Condition<VirtualFile>() { @Override public boolean value(VirtualFile virtualFile) { return virtualFile.getName().equals("doctrine.odm.xml"); } }; assertNotNull(ContainerUtil.find(DoctrineMetadataUtil.findMetadataForRepositoryClass(getProject(), "Foo\\Bar\\Repository\\FooBarRepository"), condition)); assertNotNull(ContainerUtil.find(DoctrineMetadataUtil.findMetadataForRepositoryClass(getProject(), "Entity\\BarRepository"), condition)); assertNotNull(ContainerUtil.find(DoctrineMetadataUtil.findMetadataForRepositoryClass(PhpElementsUtil.getClassInterface(getProject(), "Entity\\BarRepository")), condition)); assertNull(ContainerUtil.find(DoctrineMetadataUtil.findMetadataForRepositoryClass(getProject(), "Entity\\BarEmpty"), condition)); } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#findModelNameInScope */ public void testFindModelNameInScope() { for (String s : new String[]{ "<doctrine-foo-mapping><document name=\"Foo\\Foo\"><id attr=\"b<caret>a\"></document></doctrine-foo-mapping>", "<doctrine-foo-mapping><entity name=\"Foo\\Foo\"><id attr=\"b<caret>a\"></entity></doctrine-foo-mapping>", "<doctrine-foo-mapping><embedded-document name=\"Foo\\Foo\"><id attr=\"b<caret>a\"></embedded-document></doctrine-foo-mapping>", "<doctrine-foo-mapping><embedded name=\"Foo\\Foo\"><id attr=\"b<caret>a\"></embedded></doctrine-foo-mapping>", }) { myFixture.configureByText(XmlFileType.INSTANCE, s); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); assertEquals("Foo\\Foo", DoctrineMetadataUtil.findModelNameInScope(psiElement)); } } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil#findModelNameInScope */ public void testYamlFindModelNameInScope() { for (String s : new String[]{ "Foo\\Foo: \n type: enti<caret>tiy", "\n \n \nFoo\\Foo: \n type: enti<caret>tiy", }) { myFixture.configureByText(YAMLFileType.YML, s); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); assertEquals("Foo\\Foo", DoctrineMetadataUtil.findModelNameInScope(psiElement)); } } }