diff --git a/src/main/java/org/ayfaar/app/controllers/TermController.java b/src/main/java/org/ayfaar/app/controllers/TermController.java index 3f3d3d13..285047e2 100644 --- a/src/main/java/org/ayfaar/app/controllers/TermController.java +++ b/src/main/java/org/ayfaar/app/controllers/TermController.java @@ -4,12 +4,10 @@ import org.ayfaar.app.dao.CommonDao; import org.ayfaar.app.dao.LinkDao; import org.ayfaar.app.dao.TermDao; +import org.ayfaar.app.dao.TermMorphDao; import org.ayfaar.app.model.*; import org.ayfaar.app.spring.Model; -import org.ayfaar.app.utils.AliasesMap; -import org.ayfaar.app.utils.Morpher; -import org.ayfaar.app.utils.TermUtils; -import org.ayfaar.app.utils.ValueObjectUtils; +import org.ayfaar.app.utils.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; @@ -31,6 +29,7 @@ public class TermController { @Autowired CommonDao commonDao; @Autowired TermDao termDao; + @Autowired TermMorphDao termMorphDao; @Autowired LinkDao linkDao; @Autowired AliasesMap aliasesMap; @Autowired @@ -284,4 +283,26 @@ public void remove(@PathVariable String name) { public void reloadAliasesMap() { aliasesMap.reload(); } + + + @RequestMapping(value = "rename") + @ResponseBody + public void renameTerm(@RequestParam("oldTerm") String oldName, @RequestParam("newTerm") String newName) { + Term oldTerm = aliasesMap.getTerm(oldName); + add(newName, oldTerm.getShortDescription(), oldTerm.getDescription()); + + Term newTerm = termDao.getByName(newName); + + List<Link> links = linkDao.getAllLinks(oldTerm.getUri()); + for(Link link : links) { + if(link.getUid1().getUri().equals(oldTerm.getUri())) { + link.setUid1(newTerm); + } + else if(link.getUid2().getUri().equals(oldTerm.getUri())) { + link.setUid2(newTerm); + } + linkDao.save(link); + } + remove(oldName); + } } diff --git a/src/test/java/issues/issue66/TermControllerIntegrationTest.java b/src/test/java/issues/issue66/TermControllerIntegrationTest.java new file mode 100644 index 00000000..11f28a28 --- /dev/null +++ b/src/test/java/issues/issue66/TermControllerIntegrationTest.java @@ -0,0 +1,68 @@ +package issues.issue66; + +import org.ayfaar.app.IntegrationTest; +import org.ayfaar.app.controllers.TermController; +import org.ayfaar.app.dao.LinkDao; +import org.ayfaar.app.dao.TermDao; +import org.ayfaar.app.model.Item; +import org.ayfaar.app.model.Link; +import org.ayfaar.app.model.Term; +import org.ayfaar.app.utils.AliasesMap; +import org.ayfaar.app.utils.UriGenerator; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.junit.Assert.*; + + +public class TermControllerIntegrationTest extends IntegrationTest { + @Autowired private TermController termController; + @Autowired private TermDao termDao; + @Autowired private LinkDao linkDao; + @Autowired private AliasesMap aliasesMap; + + @Test + @Transactional + public void testRenameTerm1() { + String oldName = "ВСЕ-Воля-ВСЕ-Разума"; + String newName = "test new name"; + termController.renameTerm(oldName, newName); + + Term term = aliasesMap.getTerm(newName); + List<Link> links = linkDao.getAllLinks(term.getUri()); + + assertEquals(UriGenerator.generate(Term.class, "Разум"), links.get(0).getUid1().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(0).getUid2().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(1).getUid1().getUri()); + assertEquals(UriGenerator.generate(Item.class, "2.0170"), links.get(1).getUid2().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(2).getUid1().getUri()); + assertEquals(UriGenerator.generate(Term.class, "КРА-АГГА-АГГА"), links.get(2).getUid2().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(3).getUid1().getUri()); + assertEquals(UriGenerator.generate(Item.class, "2.0148"), links.get(3).getUid2().getUri()); + assertNull(termDao.getByName("ВСЕ-Воля-ВСЕ-Разума")); + assertEquals("Test new name", termDao.getByName("test new name").getName()); + } + + @Test + @Transactional + public void testRenameTerm2() { + String oldName = "Временная Сущность"; + String newName = "Новая Сущность"; + termController.renameTerm(oldName, newName); + + Term term = aliasesMap.getTerm(newName); + List<Link> links = linkDao.getAllLinks(term.getUri()); + + assertEquals(UriGenerator.generate(Term.class, "Время"), links.get(0).getUid1().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Новая Сущность"), links.get(0).getUid2().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Вселенская Временная Сущность"), links.get(1).getUid1().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Новая Сущность"), links.get(1).getUid2().getUri()); + assertEquals(UriGenerator.generate(Term.class, "Новая Сущность"), links.get(2).getUid1().getUri()); + assertEquals(UriGenerator.generate(Item.class, "1.1036"), links.get(2).getUid2().getUri()); + assertNull(termDao.getByName("Временная Сущность")); + assertEquals("Новая Сущность", termDao.getByName("Новая Сущность").getName()); + } +} diff --git a/src/test/java/issues/issue66/TermControllerUnitTest.java b/src/test/java/issues/issue66/TermControllerUnitTest.java new file mode 100644 index 00000000..f3963dcc --- /dev/null +++ b/src/test/java/issues/issue66/TermControllerUnitTest.java @@ -0,0 +1,73 @@ +package issues.issue66; + +import org.ayfaar.app.controllers.TermController; +import org.ayfaar.app.dao.LinkDao; +import org.ayfaar.app.dao.TermDao; +import org.ayfaar.app.model.Item; +import org.ayfaar.app.model.Link; +import org.ayfaar.app.model.Term; +import org.ayfaar.app.utils.AliasesMap; +import org.ayfaar.app.utils.UriGenerator; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.List; + +import static java.util.Arrays.asList; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class TermControllerUnitTest { + @InjectMocks @Spy TermController termController; + @Mock TermDao termDao; + @Mock AliasesMap aliasesMap; + @Mock LinkDao linkDao; + + private List<Link> links; + + @Before + public void init() { + Term term1 = new Term("Разум"); + term1.setUri(UriGenerator.generate(term1)); + Term term2 = new Term("New name"); + term2.setUri(UriGenerator.generate(term2)); + Term term3 = new Term("КРА-АГГА-АГГА"); + term3.setUri(UriGenerator.generate(term3)); + Item item1= new Item("2.0170"); + item1.setUri(UriGenerator.generate(item1)); + Item item2 = new Item("2.0148"); + item2.setUri(UriGenerator.generate(item2)); + + links = asList(new Link(term1, term2), new Link(term2, item1), + new Link(term2, term3), new Link(term2, item2)); + } + + @Test + public void testRenameTerm() { + String oldName = "ВСЕ-Воля-ВСЕ-Разума"; + String newName = "New name"; + Term oldTerm = new Term(oldName); + Term newTerm = new Term(newName); + + + when(aliasesMap.getTerm(oldName)).thenReturn(oldTerm); + when(termDao.getByName(newName)).thenReturn(newTerm); + when(linkDao.getAllLinks(oldTerm.getUri())).thenReturn(links); + doNothing().when(termController).remove(anyString()); + when(linkDao.save((Link)anyObject())).thenReturn(new Link()); + + termController.renameTerm(oldName, newName); + + verify(termController, times(1)).add(anyString(), anyString(), anyString()); + verify(termController, times(1)).remove(oldName); + verify(aliasesMap, times(1)).getTerm(oldName); + verify(termDao, times(2)).getByName(anyString()); + verify(linkDao, times(1)).getAllLinks(anyString()); + verify(linkDao, times(1)).save(links.get(0)); + } +}