Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit d0fd159e authored by Marten Gajda's avatar Marten Gajda Committed by GitHub
Browse files

Ignore recurrence if start and due are absent, fixes #841 (#844)

Apparently there are tasks which have a recurrence rule but neither a dtstart nor a due date. This caused an NPE. By treating such tasks as non-recurring this should be fixed.
parent 81f5b5a1
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import org.dmfs.opentaskspal.tables.TasksTable;
import org.dmfs.opentaskspal.tasklists.NameData;
import org.dmfs.opentaskspal.tasks.OriginalInstanceData;
import org.dmfs.opentaskspal.tasks.OriginalInstanceSyncIdData;
import org.dmfs.opentaskspal.tasks.RRuleTaskData;
import org.dmfs.opentaskspal.tasks.StatusData;
import org.dmfs.opentaskspal.tasks.SyncIdData;
import org.dmfs.opentaskspal.tasks.TimeData;
@@ -61,6 +62,8 @@ import org.dmfs.opentaskspal.tasks.VersionData;
import org.dmfs.opentaskstestpal.InstanceTestData;
import org.dmfs.rfc5545.DateTime;
import org.dmfs.rfc5545.Duration;
import org.dmfs.rfc5545.recur.InvalidRecurrenceRuleException;
import org.dmfs.rfc5545.recur.RecurrenceRule;
import org.dmfs.tasks.contract.TaskContract.Instances;
import org.dmfs.tasks.contract.TaskContract.TaskLists;
import org.dmfs.tasks.contract.TaskContract.Tasks;
@@ -904,4 +907,39 @@ public class TaskProviderTest
        ));
    }


    /**
     * Create task with start and due, check datetime values including generated duration.
     */
    @Test
    public void testInsertTaskWithoutStartAndDueButRRULE() throws InvalidRecurrenceRuleException
    {
        RowSnapshot<TaskLists> taskList = new VirtualRowSnapshot<>(new LocalTaskListsTable(mAuthority));
        RowSnapshot<Tasks> task = new VirtualRowSnapshot<>(new TaskListScoped(taskList, new TasksTable(mAuthority)));

        DateTime start = DateTime.now();
        DateTime due = start.addDuration(new Duration(1, 1, 0));

        assertThat(new Seq<>(
                        new Put<>(taskList, new EmptyRowData<>()),
                        new Put<>(task, new Composite<>(
                                new TitleData("test"),
                                new RRuleTaskData(new RecurrenceRule("FREQ=DAILY;COUNT=5", RecurrenceRule.RfcMode.RFC2445_LAX))))),
                resultsIn(mClient,
                        new Assert<>(task, new Composite<>(
                                new TitleData("test"),
                                new VersionData(0))),
                        new AssertRelated<>(
                                new InstanceTable(mAuthority), Instances.TASK_ID, task,
                                new Composite<>(
                                        new CharSequenceRowData<>(Tasks.TITLE, "test"),
                                        new InstanceTestData(
                                                absent(),
                                                absent(),
                                                absent(),
                                                0),
                                        new CharSequenceRowData<>(Tasks.TZ, null))
                        )));
    }

}
+2 −1
Original line number Diff line number Diff line
@@ -44,7 +44,8 @@ public abstract class AbstractTaskAdapter implements TaskAdapter
    @Override
    public boolean isRecurring()
    {
        return valueOf(RRULE) != null || valueOf(RDATE).iterator().hasNext();
        // recurring tasks must have an RRULE or RDATEs and at least one of DTSTART and DUE date
        return (valueOf(RRULE) != null || valueOf(RDATE).iterator().hasNext()) && (valueOf(DTSTART) != null || valueOf(DUE) != null);
    }