/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.zeppelin.notebook;
import org.apache.zeppelin.interpreter.Interpreter;
import org.apache.zeppelin.interpreter.InterpreterFactory;
import org.apache.zeppelin.interpreter.InterpreterSettingManager;
import org.apache.zeppelin.notebook.repo.NotebookRepo;
import org.apache.zeppelin.scheduler.Scheduler;
import org.apache.zeppelin.search.SearchService;
import org.apache.zeppelin.user.Credentials;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@RunWith(MockitoJUnitRunner.class)
public class FolderViewTest {
@Mock
NotebookRepo repo;
@Mock
JobListenerFactory jobListenerFactory;
@Mock
SearchService index;
@Mock
Credentials credentials;
@Mock
Interpreter interpreter;
@Mock
Scheduler scheduler;
@Mock
NoteEventListener noteEventListener;
@Mock
InterpreterFactory interpreterFactory;
@Mock
InterpreterSettingManager interpreterSettingManager;
FolderView folderView;
Note note1;
Note note2;
Note note3;
List<String> testNoteNames = Arrays.asList(
"note1", "/note2",
"a/note1", "/a/note2",
"a/b/note1", "/a/b/note2"
);
Folder rootFolder;
Folder aFolder;
Folder abFolder;
Note rootNote1;
Note rootNote2;
Note aNote1;
Note aNote2;
Note abNote1;
Note abNote2;
private Note createNote() {
Note note = new Note(repo, interpreterFactory, interpreterSettingManager, jobListenerFactory, index, credentials, noteEventListener);
note.setNoteNameListener(folderView);
return note;
}
@Before
public void createNotesAndFolderMap() {
folderView = new FolderView();
for (String noteName : testNoteNames) {
Note note = createNote();
note.setName(noteName);
folderView.putNote(note);
}
rootFolder = folderView.getFolder("/");
aFolder = folderView.getFolder("a");
abFolder = folderView.getFolder("a/b");
rootNote1 = rootFolder.getNotes().get(0);
rootNote2 = rootFolder.getNotes().get(1);
aNote1 = aFolder.getNotes().get(0);
aNote2 = aFolder.getNotes().get(1);
abNote1 = abFolder.getNotes().get(0);
abNote2 = abFolder.getNotes().get(1);
}
@Test
public void putNoteTest() {
assertEquals(6, folderView.countNotes());
assertEquals(3, folderView.countFolders());
assertEquals(2, rootFolder.countNotes());
assertEquals(2, aFolder.countNotes());
assertEquals(2, abFolder.countNotes());
assertEquals("note1", rootNote1.getName());
assertEquals("/note2", rootNote2.getName());
assertEquals("a/note1", aNote1.getName());
assertEquals("/a/note2", aNote2.getName());
assertEquals("a/b/note1", abNote1.getName());
assertEquals("/a/b/note2", abNote2.getName());
}
@Test
public void getTest() {
assertEquals(rootFolder, folderView.getFolder("/"));
assertEquals(aFolder, folderView.getFolder("a"));
assertEquals(aFolder, folderView.getFolder("/a"));
assertEquals(aFolder, folderView.getFolder("a/"));
assertEquals(aFolder, folderView.getFolder("/a/"));
assertEquals(abFolder, folderView.getFolder("a/b"));
assertEquals(abFolder, folderView.getFolder("/a/b"));
assertEquals(abFolder, folderView.getFolder("a/b/"));
assertEquals(abFolder, folderView.getFolder("/a/b/"));
}
@Test
public void removeNoteTest() {
Note rootNote1 = rootFolder.getNotes().get(0);
Note aNote1 = aFolder.getNotes().get(0);
Note abNote1 = abFolder.getNotes().get(0);
folderView.removeNote(rootNote1);
folderView.removeNote(aNote1);
folderView.removeNote(abNote1);
assertEquals(3, folderView.countFolders());
assertEquals(3, folderView.countNotes());
assertEquals(1, rootFolder.countNotes());
assertEquals(1, aFolder.countNotes());
assertEquals(1, abFolder.countNotes());
}
@Test
public void renameFolderOrdinaryTest() {
// "a/b" -> "a/c"
String oldName = "a/b";
String newName = "a/c";
Folder oldFolder = folderView.renameFolder(oldName, newName);
Folder newFolder = folderView.getFolder(newName);
assertNull(folderView.getFolder(oldName));
assertNotNull(newFolder);
assertEquals(3, folderView.countFolders());
assertEquals(6, folderView.countNotes());
assertEquals(abFolder, oldFolder);
assertEquals(newName, abFolder.getId());
assertEquals(newName, newFolder.getId());
assertEquals(newName + "/note1", abNote1.getName());
assertEquals(newName + "/note2", abNote2.getName());
}
@Test
public void renameFolderTargetExistsAndHasChildTest() {
// "a" -> "a/b"
String oldName = "a";
String newName = "a/b";
Folder oldFolder = folderView.renameFolder(oldName, newName);
Folder newFolder = folderView.getFolder(newName);
assertNotNull(folderView.getFolder("a"));
assertNotNull(folderView.getFolder("a/b"));
assertNotNull(folderView.getFolder("a/b/b"));
assertEquals(0, folderView.getFolder("a").countNotes());
assertEquals(2, folderView.getFolder("a/b").countNotes());
assertEquals(2, folderView.getFolder("a/b/b").countNotes());
assertEquals(4, folderView.countFolders());
assertEquals(6, folderView.countNotes());
assertEquals(newName, aFolder.getId());
assertEquals(newName, newFolder.getId());
assertEquals(newName + "/note1", aNote1.getName());
assertEquals(newName + "/note2", aNote2.getName());
assertEquals(newName + "/b" + "/note1", abNote1.getName());
assertEquals(newName + "/b" + "/note2", abNote2.getName());
}
@Test
public void renameRootFolderTest() {
String newName = "lalala";
Folder nothing = folderView.renameFolder("/", newName);
assertNull(nothing);
assertNull(folderView.getFolder(newName));
}
@Test
public void renameFolderToRootTest() {
// "a/b" -> "/"
String oldName = "a/b";
String newName = "/";
Folder oldFolder = folderView.renameFolder(oldName, newName);
Folder newFolder = folderView.getFolder(newName);
assertNull(folderView.getFolder(oldName));
assertNotNull(newFolder);
assertEquals(2, folderView.countFolders());
assertEquals(6, folderView.countNotes());
assertEquals(abFolder, oldFolder);
assertEquals(rootFolder, newFolder);
assertEquals(newName, rootFolder.getId());
assertEquals("note1", abNote1.getName());
assertEquals("note2", abNote2.getName());
}
@Test
public void renameFolderNotExistsTest() {
// "x/y/z" -> "a"
String oldName = "x/y/z";
String newName = "a";
Folder oldFolder = folderView.renameFolder(oldName, newName);
assertNull(oldFolder);
}
@Test
public void renameFolderSameNameTest() {
// "a" -> "a"
String sameName = "a";
Folder oldFolder = folderView.renameFolder(sameName, sameName);
Folder newFolder = folderView.getFolder(sameName);
assertEquals(aFolder, oldFolder);
assertEquals(aFolder, newFolder);
assertNotNull(folderView.getFolder(sameName));
assertNotNull(newFolder);
assertEquals(sameName, aFolder.getId());
}
/**
* Should rename a empty folder
*/
@Test
public void renameEmptyFolderTest() {
// Create a note of which name is "x/y/z" and rename "x" -> "u"
Note note = createNote();
note.setName("x/y/z");
folderView.putNote(note);
folderView.renameFolder("x", "u");
assertNotNull(folderView.getFolder("u"));
assertNotNull(folderView.getFolder("u/y"));
}
/**
* Should also rename child folders of the target folder
*/
@Test
public void renameFolderHasChildrenTest() {
// "a" -> "x"
// "a/b" should also be renamed to "x/b"
folderView.renameFolder("a", "x");
assertNotNull(folderView.getFolder("x/b"));
}
@Test
public void onNameChangedTest() {
Note newNote = createNote();
assert (!folderView.hasNote(newNote));
newNote.setName(" ");
assert (!folderView.hasNote(newNote));
newNote.setName("a/b/newNote");
assert (folderView.hasNote(newNote));
assertEquals(abFolder, folderView.getFolderOf(newNote));
newNote.setName("newNote");
assert (!abFolder.getNotes().contains(newNote));
assertEquals(rootFolder, folderView.getFolderOf(newNote));
}
@Test
public void renameHighDepthFolderTest() {
Note note = createNote();
note.setName("x/y/z");
Folder folder = folderView.getFolder("x");
folder.rename("d");
assertEquals("d/y/z", note.getName());
assertNull(folderView.getFolder("x"));
assertNotNull(folderView.getFolder("d"));
assertNotNull(folderView.getFolder("d/y"));
}
@Test
public void renameFolderMergingTest() {
Note xNote1 = createNote();
Note xbNote1 = createNote();
xNote1.setName("x/note1");
xbNote1.setName("x/b/note1");
folderView.getFolder("a").rename("x");
assertEquals(3, folderView.getFolder("x").countNotes());
assertEquals(3, folderView.getFolder("x/b").countNotes());
}
}