/*
 *  Copyright (C) 2021 Stichting Akvo (Akvo Foundation)
 *
 *  This file is part of Akvo FLOW.
 *
 *  Akvo FLOW is free software: you can redistribute it and modify it under the terms of
 *  the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
 *  either version 3 of the License or any later version.
 *
 *  Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *  See the GNU Affero General Public License included below for more details.
 *
 *  The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
 */

package org.akvo.flow.rest.handler;

import com.gallatinsystems.surveyal.dao.SurveyedLocaleDao;
import com.gallatinsystems.surveyal.domain.SurveyedLocale;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import org.akvo.flow.api.app.DataStoreTestUtil;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.waterforpeople.mapping.app.gwt.client.surveyinstance.SurveyInstanceDto;
import org.waterforpeople.mapping.dao.SurveyInstanceDAO;
import org.waterforpeople.mapping.domain.SurveyInstance;

import java.util.List;

import static org.akvo.flow.api.app.DataStoreTestUtil.DEFAULT_REGISTRATION_FORM_ID;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

public class FormInstanceRequestHandlerTests {

    private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
    private DataStoreTestUtil dataStoreTestUtil;


    @BeforeEach
    public void setUp() {
        helper.setUp();
        dataStoreTestUtil = new DataStoreTestUtil();
    }

    @AfterEach
    public void tearDown() {
        helper.tearDown();
    }

    @Test
    public void testDeleteMonitoringFormInstance() {
        Long surveyId = dataStoreTestUtil.randomId();
        List<SurveyedLocale> singleDataPointList = dataStoreTestUtil.createDataPoints(surveyId, 1);
        List<SurveyInstance> formInstances = dataStoreTestUtil.createFormInstances(singleDataPointList, 2);

        FormInstanceRequestHandler requestHandler = new FormInstanceRequestHandler();
        requestHandler.deleteFormInstance(formInstances.get(1));

        SurveyInstanceDAO siDao = new SurveyInstanceDAO();
        List<SurveyInstance> remainingFormInstances = siDao.listInstancesByLocale(singleDataPointList.get(0).getKey().getId(), null, null, null);
        assertEquals(1, remainingFormInstances.size(), "Expecting one form instance to remain");
        assertEquals(DEFAULT_REGISTRATION_FORM_ID, remainingFormInstances.get(0).getSurveyId());
    }

    @Test
    public void testDeleteRegistrationFormInstance() {
        Long surveyId = dataStoreTestUtil.randomId();
        Long registrationFormId = dataStoreTestUtil.randomId();
        List<SurveyedLocale> singleDataPointList = dataStoreTestUtil.createDataPoints(surveyId, registrationFormId, 1);
        List<SurveyInstance> formInstances = dataStoreTestUtil.createFormInstances(singleDataPointList, 3);

        long dataPointId = singleDataPointList.get(0).getKey().getId();
        FormInstanceRequestHandler requestHandler = new FormInstanceRequestHandler();
        SurveyInstance registrationFormInstance = formInstances.get(0);
        requestHandler.deleteFormInstance(registrationFormInstance);

        SurveyInstanceDAO siDao = new SurveyInstanceDAO();
        List<SurveyInstance> remainingFormInstance = siDao.listInstancesByLocale(dataPointId, null, null, null);
        assertEquals(0, remainingFormInstance.size(), "Expecting no form instance to remain");
        assertNull(new SurveyedLocaleDao().getByKey(dataPointId), "Expect datapoint to have been deleted");
    }
}

@@ -4005,11 +4005,949 @@
 );%0A    %7D
+%0A%0A    @Test%0A    public void testDeleteOrphanedInstance() %7B%0A        Long surveyId = dataStoreTestUtil.randomId();%0A        List%3CSurveyedLocale%3E singleDataPointList = dataStoreTestUtil.createDataPoints(surveyId, 1);%0A        List%3CSurveyInstance%3E formInstances = dataStoreTestUtil.createFormInstances(singleDataPointList, 1);%0A%0A        SurveyedLocaleDao slDao = new SurveyedLocaleDao();%0A        slDao.deleteSurveyedLocale(singleDataPointList.get(0));%0A        formInstances.get(0).setSurveyedLocaleId(null);%0A%0A        FormInstanceRequestHandler requestHandler = new FormInstanceRequestHandler();%0A        requestHandler.deleteFormInstance(formInstances.get(0));%0A%0A        SurveyInstanceDAO siDao = new SurveyInstanceDAO();%0A        List%3CSurveyInstance%3E remainingFormInstances = siDao.listSurveyInstanceBySurvey(DEFAULT_REGISTRATION_FORM_ID, null);%0A        assertEquals(0, remainingFormInstances.size(), %22Expecting no form instance to remain%22);%0A    %7D
 %0A%7D%0A

Add test for deleting orphaned form instances