@@ -65,13 +65,15 @@ import com.terraformation.backend.tracking.db.InvalidObservationStartDateExcepti
6565import com.terraformation.backend.tracking.db.ObservationAlreadyStartedException
6666import com.terraformation.backend.tracking.db.ObservationHasNoSubzonesException
6767import com.terraformation.backend.tracking.db.ObservationNotFoundException
68+ import com.terraformation.backend.tracking.db.ObservationPlotNotFoundException
6869import com.terraformation.backend.tracking.db.ObservationRescheduleStateException
6970import com.terraformation.backend.tracking.db.ObservationStore
7071import com.terraformation.backend.tracking.db.ObservationTestHelper
7172import com.terraformation.backend.tracking.db.PlantingSiteNotDetailedException
7273import com.terraformation.backend.tracking.db.PlantingSiteNotFoundException
7374import com.terraformation.backend.tracking.db.PlantingSiteStore
7475import com.terraformation.backend.tracking.db.PlotAlreadyCompletedException
76+ import com.terraformation.backend.tracking.db.PlotNotCompletedException
7577import com.terraformation.backend.tracking.db.PlotNotInObservationException
7678import com.terraformation.backend.tracking.db.PlotSizeNotReplaceableException
7779import com.terraformation.backend.tracking.db.ScheduleObservationWithoutPlantsException
@@ -2766,6 +2768,76 @@ class ObservationServiceTest : DatabaseTest(), RunsAsDatabaseUser {
27662768 }
27672769 }
27682770
2771+ @Nested
2772+ inner class UpdateCompletedPlot {
2773+ private lateinit var monitoringPlotId: MonitoringPlotId
2774+ private lateinit var observationId: ObservationId
2775+
2776+ @BeforeEach
2777+ fun setUpPlot () {
2778+ insertPlantingZone()
2779+ insertPlantingSubzone()
2780+ monitoringPlotId = insertMonitoringPlot()
2781+ observationId = insertObservation()
2782+ insertObservationPlot(completedBy = user.userId)
2783+ }
2784+
2785+ @Test
2786+ fun `calls function to perform updates` () {
2787+ val initial = dslContext.fetchSingle(OBSERVATION_PLOTS )
2788+
2789+ service.updateCompletedPlot(observationId, monitoringPlotId) {
2790+ dslContext.update(OBSERVATION_PLOTS ).set(OBSERVATION_PLOTS .NOTES , " new notes" ).execute()
2791+ }
2792+
2793+ val expected = initial.copy().apply { notes = " new notes" }
2794+
2795+ assertTableEquals(expected)
2796+ }
2797+
2798+ @Test
2799+ fun `rolls back changes if function throws exception` () {
2800+ val expected = dslContext.fetch(OBSERVATION_PLOTS )
2801+
2802+ assertThrows<IllegalStateException > {
2803+ service.updateCompletedPlot(observationId, monitoringPlotId) {
2804+ dslContext.update(OBSERVATION_PLOTS ).set(OBSERVATION_PLOTS .NOTES , " new notes" ).execute()
2805+ throw IllegalStateException (" oops" )
2806+ }
2807+ }
2808+
2809+ assertTableEquals(expected)
2810+ }
2811+
2812+ @Test
2813+ fun `throws exception if plot is not in specified observation` () {
2814+ val otherObservationId = insertObservation()
2815+
2816+ assertThrows<ObservationPlotNotFoundException > {
2817+ service.updateCompletedPlot(otherObservationId, monitoringPlotId) {}
2818+ }
2819+ }
2820+
2821+ @Test
2822+ fun `throws exception if plot is not completed yet` () {
2823+ val otherPlotId = insertMonitoringPlot()
2824+ insertObservationPlot()
2825+
2826+ assertThrows<PlotNotCompletedException > {
2827+ service.updateCompletedPlot(observationId, otherPlotId) {}
2828+ }
2829+ }
2830+
2831+ @Test
2832+ fun `throws exception if no permission to update observation` () {
2833+ deleteOrganizationUser()
2834+
2835+ assertThrows<ObservationNotFoundException > {
2836+ service.updateCompletedPlot(observationId, monitoringPlotId) {}
2837+ }
2838+ }
2839+ }
2840+
27692841 /* *
27702842 * Inserts a permanent monitoring plot with a given index. By default, the plots are stacked
27712843 * northward, that is, index 1 is at y=0, index 2 is at y=1, and index 3 is at y=2.
0 commit comments