diff --git a/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java b/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java index 52b8b9025..80ad41ec9 100644 --- a/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java +++ b/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java @@ -146,6 +146,7 @@ public Screen rebuildSessionFromFrame(MenuSession menuSession, CaseSearchHelper screen = menuSession.getNextScreen(needsFullInit, entityScreenContext); continue; } + if (currentStep == null && processedStepsCount != steps.size()) { checkAndLogCaseIDMatchError(steps, processedSteps, neededDatum.getDataId()); } diff --git a/src/main/java/org/commcare/formplayer/session/MenuSession.java b/src/main/java/org/commcare/formplayer/session/MenuSession.java index 7f31704b5..e78c4113b 100644 --- a/src/main/java/org/commcare/formplayer/session/MenuSession.java +++ b/src/main/java/org/commcare/formplayer/session/MenuSession.java @@ -184,7 +184,7 @@ public boolean handleInput(@Nullable Screen screen, String input, boolean needsF if (screen instanceof EntityScreen) { EntityScreen entityScreen = (EntityScreen)screen; boolean autoLaunch = entityScreen.getAutoLaunchAction() != null && allowAutoLaunch; - addBreadcrumb = !autoLaunch; + addBreadcrumb = !(autoLaunch || entityScreen.shouldBeSkipped()); if (input.startsWith("action ") || (autoLaunch) || !inputValidated) { screen.init(sessionWrapper); // auto-launch takes preference over auto-select @@ -224,11 +224,13 @@ public boolean handleInput(@Nullable Screen screen, String input, boolean needsF * current index based selections[] to contain menu ids instead of indexes. */ if (entityScreenContext.isRespectRelevancy()) { - if (screen instanceof EntityScreen) { + if (screen instanceof EntityScreen && !screen.shouldBeSkipped()) { String breadcrumb = screen.getBreadcrumb(input, sandbox, getSessionWrapper()); persistentMenuHelper.addEntitySelection(persistentMenuId, breadcrumb); + persistentMenuHelper.advanceCurrentMenuWithInput(screen, persistentMenuId); + } else if (screen instanceof MenuScreen) { + persistentMenuHelper.advanceCurrentMenuWithInput(screen, persistentMenuId); } - persistentMenuHelper.advanceCurrentMenuWithInput(screen, persistentMenuId); } return true; } catch (ArrayIndexOutOfBoundsException | NullPointerException e) { diff --git a/src/test/java/org/commcare/formplayer/tests/CaseListAutoSelectTests.kt b/src/test/java/org/commcare/formplayer/tests/CaseListAutoSelectTests.kt index 9bc5c43f3..41a1a0b3e 100644 --- a/src/test/java/org/commcare/formplayer/tests/CaseListAutoSelectTests.kt +++ b/src/test/java/org/commcare/formplayer/tests/CaseListAutoSelectTests.kt @@ -2,10 +2,12 @@ package org.commcare.formplayer.tests import org.commcare.formplayer.beans.NewFormResponse import org.commcare.formplayer.beans.menus.EntityListResponse +import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest + @WebMvcTest class CaseListAutoSelectTests : BaseTestClass() { @@ -28,7 +30,24 @@ class CaseListAutoSelectTests : BaseTestClass() { fun testAutoSelection() { // We directly go to the form without selecting the case val selections = arrayOf("0", "2") - sessionNavigate(selections, APP, NewFormResponse::class.java) + var response = sessionNavigate(selections, APP, NewFormResponse::class.java) + + // test breadcrumb + assertEquals( 3, response.breadcrumbs.size) + assertEquals( "Untitled Application", response.breadcrumbs[0]) + assertEquals( "Case List", response.breadcrumbs[1]) + assertEquals( "Followup Form 1", response.breadcrumbs[2]) + + // test persistent menu + val persistentMenu = response.persistentMenu + assertEquals(2, persistentMenu.size) + assertEquals("Case List", persistentMenu[0].displayText) + assertEquals("Case List 1", persistentMenu[1].displayText) + val zeroSelectionMenu = persistentMenu[0].commands + assertEquals(3, zeroSelectionMenu.size) + assertEquals("Registration Form", zeroSelectionMenu[0].displayText) + assertEquals("Followup Form", zeroSelectionMenu[1].displayText) + assertEquals("Followup Form 1", zeroSelectionMenu[2].displayText) } @Test diff --git a/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseClaimTest.java b/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseClaimTest.java index 088d36570..7f02ed469 100644 --- a/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseClaimTest.java +++ b/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseClaimTest.java @@ -17,6 +17,7 @@ import org.commcare.formplayer.beans.NewFormResponse; import org.commcare.formplayer.beans.menus.CommandListResponseBean; import org.commcare.formplayer.beans.menus.EntityListResponse; +import org.commcare.formplayer.beans.menus.PersistentCommand; import org.commcare.formplayer.mocks.FormPlayerPropertyManagerMock; import org.commcare.formplayer.utils.MockRequestUtils; import org.commcare.formplayer.utils.WithHqUser; @@ -202,6 +203,13 @@ public void testAutoSelection() throws Exception { assertEquals(reponse.getSelections().length, 1); assertEquals(reponse.getSelections()[0], "2"); assertEquals("Close", reponse.getCommands()[0].getDisplayText()); + + // Persistent Menu And Breadcrumbs should not contain the auto-selected entities + ArrayList subMenu = reponse.getPersistentMenu().get(2).getCommands(); + assertEquals(1, subMenu.size()); + assertEquals("Close", subMenu.get(0).getDisplayText()); // directly contains the form instead of entity selection + assertEquals(ImmutableList.of("Case Claim", "Follow Up"), + Arrays.stream(reponse.getBreadcrumbs()).toList()); } ArrayList updatedSelections = new ArrayList<>(Arrays.asList(reponse.getSelections())); @@ -211,6 +219,15 @@ public void testAutoSelection() throws Exception { APP_NAME, null, NewFormResponse.class); + ArrayList subMenu = formResponse.getPersistentMenu().get(2).getCommands(); + assertEquals(1, subMenu.size()); + assertEquals("Close", subMenu.get(0).getDisplayText()); + assertEquals(ImmutableList.of("Case Claim", "Follow Up", "Close"), + Arrays.stream(formResponse.getBreadcrumbs()).toList()); + String[] selectedValues = new String[]{"94f8d030-c6f9-49e0-bc3f-5e0cdbf10c18", + "0156fa3e-093e-4136-b95c-01b13dae66c7", + "0156fa3e-093e-4136-b95c-01b13dae66c8"}; + checkForSelectedEntitiesInstance(formResponse.getSessionId(), selectedValues); } @Test diff --git a/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseListTest.java b/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseListTest.java index 5e364eb23..985a434fe 100644 --- a/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseListTest.java +++ b/src/test/java/org/commcare/formplayer/tests/MultiSelectCaseListTest.java @@ -241,6 +241,7 @@ public void testPersistentMenu() throws Exception { expectedMenu.add(new PersistentCommand("0", "Case List", "jr://file/commcare/image/m0customicon_en.png", NavIconState.NEXT)); expectedMenu.add(new PersistentCommand("1", "Case List", null, NavIconState.NEXT)); expectedMenu.add(new PersistentCommand("2", "Menu with Auto Submit Form", null, NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("3", "Single Form Auto Select", null, NavIconState.NEXT)); assertEquals(expectedMenu, menuResponse.getPersistentMenu()); selections = new String[]{"0"}; @@ -266,4 +267,42 @@ public void testPersistentMenu() throws Exception { firstSecondMenu.addCommand(new PersistentCommand(guid, "(2) 123, ...", null, NavIconState.ENTITY_SELECT)); assertEquals(expectedMenu, formResponse.getPersistentMenu()); } + + @Test + public void testPersistentMenuWithAutoSelect() throws Exception { + ArrayList expectedMenu = new ArrayList<>(); + expectedMenu.add(new PersistentCommand("0", "Case List", "jr://file/commcare/image/m0customicon_en.png", NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("1", "Case List", null, NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("2", "Menu with Auto Submit Form", null, NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("3", "Single Form Auto Select", null, NavIconState.NEXT)); + PersistentCommand firstMenu = expectedMenu.get(0); + firstMenu.addCommand(new PersistentCommand("0","Registration Form", null, NavIconState.JUMP)); + firstMenu.addCommand(new PersistentCommand("1","Followup Form", null, NavIconState.JUMP)); + firstMenu.addCommand(new PersistentCommand("2","Followup Form with AutoSelect Datum", "jr://file/commcare/image/m0f2customicon_en.png", NavIconState.NEXT)); + firstMenu.addCommand(new PersistentCommand("3","Followup Form with AutoSelect Datum", null, NavIconState.NEXT)); + String[] selections = new String[]{"0", "2"}; + NewFormResponse formResponse = sessionNavigate(selections, APP, NewFormResponse.class); + assertEquals(expectedMenu, formResponse.getPersistentMenu()); + } + + @Test + public void testPersistentMenuWithAutoAdvance() throws Exception { + ArrayList expectedMenu = new ArrayList<>(); + expectedMenu.add(new PersistentCommand("0", "Case List", "jr://file/commcare/image/m0customicon_en.png", NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("1", "Case List", null, NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("2", "Menu with Auto Submit Form", null, NavIconState.NEXT)); + expectedMenu.add(new PersistentCommand("3", "Single Form Auto Select", null, NavIconState.NEXT)); + + // Auto-Advance in a Auto Select Case List + String[] selections = new String[]{"3"}; + NewFormResponse formResponse = sessionNavigate(selections, APP, NewFormResponse.class); + assertEquals(expectedMenu, formResponse.getPersistentMenu()); + + FormPlayerPropertyManagerMock.mockAutoAdvanceMenu(storageFactoryMock, false); + selections = new String[]{"3", "0"}; + formResponse = sessionNavigate(selections, APP, NewFormResponse.class); + expectedMenu.get(3).addCommand(new PersistentCommand("0", "Followup Form with AutoSelect Datum", + "jr://file/commcare/image/m0f2customicon_en.png", NavIconState.JUMP)); + assertEquals(expectedMenu, formResponse.getPersistentMenu()); + } } diff --git a/src/test/resources/archives/case_claim_with_multi_select/profile.ccpr b/src/test/resources/archives/case_claim_with_multi_select/profile.ccpr index 0c5a5041b..5b0088ab3 100644 --- a/src/test/resources/archives/case_claim_with_multi_select/profile.ccpr +++ b/src/test/resources/archives/case_claim_with_multi_select/profile.ccpr @@ -72,7 +72,7 @@ - + diff --git a/src/test/resources/archives/case_list_auto_select/profile.ccpr b/src/test/resources/archives/case_list_auto_select/profile.ccpr index abe123043..c81000147 100644 --- a/src/test/resources/archives/case_list_auto_select/profile.ccpr +++ b/src/test/resources/archives/case_list_auto_select/profile.ccpr @@ -21,6 +21,10 @@ + + + + diff --git a/src/test/resources/archives/case_list_auto_select/suite.xml b/src/test/resources/archives/case_list_auto_select/suite.xml index 33d96ea66..44f93cf7d 100644 --- a/src/test/resources/archives/case_list_auto_select/suite.xml +++ b/src/test/resources/archives/case_list_auto_select/suite.xml @@ -118,9 +118,7 @@
http://openrosa.org/formdesigner/99F89DA7-E568-4952-9BAF-717263F2C5DD
- - - + Followup Form 1 @@ -148,9 +146,7 @@ - - - + Case List 1 diff --git a/src/test/resources/archives/multi_select_case_list/suite.xml b/src/test/resources/archives/multi_select_case_list/suite.xml index f1971da46..4444b731f 100644 --- a/src/test/resources/archives/multi_select_case_list/suite.xml +++ b/src/test/resources/archives/multi_select_case_list/suite.xml @@ -199,6 +199,11 @@ Menu with Auto Submit Form + + Single Form Auto Select + + +