package de.westnordost.streetcomplete.data.osmnotes; import junit.framework.TestCase; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import de.westnordost.osmapi.common.errors.OsmConflictException; import de.westnordost.osmapi.map.data.OsmLatLon; import de.westnordost.osmapi.notes.Note; import de.westnordost.osmapi.notes.NotesDao; import de.westnordost.streetcomplete.data.QuestStatus; import static org.mockito.Mockito.*; public class OsmNoteQuestChangesUploadTest extends TestCase { public void testCancel() throws InterruptedException { OsmNoteQuestDao questDb = mock(OsmNoteQuestDao.class); when(questDb.getAll(null, QuestStatus.ANSWERED)).thenAnswer( new Answer<List<OsmNoteQuest>>() { @Override public List<OsmNoteQuest> answer(InvocationOnMock invocation) throws Throwable { Thread.sleep(1000); // take your time... ArrayList<OsmNoteQuest> result = new ArrayList<>(); result.add(null); return result; } }); final OsmNoteQuestChangesUpload u = new OsmNoteQuestChangesUpload(null, questDb, null); final AtomicBoolean cancel = new AtomicBoolean(false); Thread t = new Thread(new Runnable() { @Override public void run() { u.upload(cancel); } }); t.start(); cancel.set(true); // cancelling the thread works if we come out here without exceptions. If the note upload // would actually try to start anything, there would be a nullpointer exception since we // feeded it only with nulls to work with t.join(); } public void testDropCommentWhenConflict() { OsmNoteQuest quest = createQuest(); NotesDao osmDao = mock(NotesDao.class); when(osmDao.comment(anyLong(), anyString())).thenThrow(OsmConflictException.class); OsmNoteQuestDao questDb = mock(OsmNoteQuestDao.class); NoteDao noteDb = mock(NoteDao.class); assertNull(new OsmNoteQuestChangesUpload(osmDao, questDb, noteDb).uploadNoteChanges(quest)); verify(questDb).delete(quest.getId()); verify(noteDb).delete(quest.getNote().id); } public void testUploadComment() { OsmNoteQuest quest = createQuest(); NotesDao osmDao = mock(NotesDao.class); when(osmDao.comment(anyLong(), anyString())).thenReturn(mock(Note.class)); OsmNoteQuestDao questDb = mock(OsmNoteQuestDao.class); NoteDao noteDb = mock(NoteDao.class); Note n = new OsmNoteQuestChangesUpload(osmDao, questDb, noteDb).uploadNoteChanges(quest); assertNotNull(n); assertEquals(n, quest.getNote()); assertEquals(QuestStatus.HIDDEN, quest.getStatus()); verify(questDb).update(quest); verify(noteDb).put(n); } private OsmNoteQuest createQuest() { Note note = new Note(); note.id = 1; note.position = new OsmLatLon(1.0, 2.0); OsmNoteQuest quest = new OsmNoteQuest(note); quest.setId(3); quest.setStatus(QuestStatus.NEW); quest.setComment("blablub"); return quest; } }