From bd01eebfa57b4012bc7a7abc1aaaa1b69278b9de Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 19 Feb 2012 15:38:50 -0500
Subject: [PATCH] Merged issues/lucene branch

---
 tests/com/gitblit/tests/IssuesTest.java |  256 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 256 insertions(+), 0 deletions(-)

diff --git a/tests/com/gitblit/tests/IssuesTest.java b/tests/com/gitblit/tests/IssuesTest.java
new file mode 100644
index 0000000..a5d487d
--- /dev/null
+++ b/tests/com/gitblit/tests/IssuesTest.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2012 gitblit.com.
+ *
+ * Licensed 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 com.gitblit.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.bouncycastle.util.Arrays;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Test;
+
+import com.gitblit.models.IssueModel;
+import com.gitblit.models.IssueModel.Attachment;
+import com.gitblit.models.IssueModel.Change;
+import com.gitblit.models.IssueModel.Field;
+import com.gitblit.models.IssueModel.Priority;
+import com.gitblit.models.IssueModel.Status;
+import com.gitblit.models.SearchResult;
+import com.gitblit.utils.IssueUtils;
+import com.gitblit.utils.IssueUtils.IssueFilter;
+import com.gitblit.utils.LuceneUtils;
+
+/**
+ * Tests the mechanics of distributed issue management on the gb-issues branch.
+ * 
+ * @author James Moger
+ * 
+ */
+public class IssuesTest {
+
+	@Test
+	public void testCreation() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		// create and insert the issue
+		Change c1 = newChange("testCreation() " + Long.toHexString(System.currentTimeMillis()));
+		IssueModel issue = IssueUtils.createIssue(repository, c1);
+		assertNotNull(issue.id);
+
+		// retrieve issue and compare
+		IssueModel constructed = IssueUtils.getIssue(repository, issue.id);
+		compare(issue, constructed);
+
+		assertEquals(1, constructed.changes.size());
+	}
+
+	@Test
+	public void testUpdates() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		// C1: create the issue
+		Change c1 = newChange("testUpdates() " + Long.toHexString(System.currentTimeMillis()));
+		IssueModel issue = IssueUtils.createIssue(repository, c1);
+		assertNotNull(issue.id);
+
+		IssueModel constructed = IssueUtils.getIssue(repository, issue.id);
+		compare(issue, constructed);
+
+		// C2: set owner
+		Change c2 = new Change("C2");
+		c2.comment("I'll fix this");
+		c2.setField(Field.Owner, c2.author);
+		assertTrue(IssueUtils.updateIssue(repository, issue.id, c2));
+		constructed = IssueUtils.getIssue(repository, issue.id);
+		assertEquals(2, constructed.changes.size());
+		assertEquals(c2.author, constructed.owner);
+
+		// C3: add a note
+		Change c3 = new Change("C3");
+		c3.comment("yeah, this is working");
+		assertTrue(IssueUtils.updateIssue(repository, issue.id, c3));
+		constructed = IssueUtils.getIssue(repository, issue.id);
+		assertEquals(3, constructed.changes.size());
+
+		// C4: add attachment
+		Change c4 = new Change("C4");
+		Attachment a = newAttachment();
+		c4.addAttachment(a);
+		assertTrue(IssueUtils.updateIssue(repository, issue.id, c4));
+
+		Attachment a1 = IssueUtils.getIssueAttachment(repository, issue.id, a.name);
+		assertEquals(a.content.length, a1.content.length);
+		assertTrue(Arrays.areEqual(a.content, a1.content));
+
+		// C5: close the issue
+		Change c5 = new Change("C5");
+		c5.comment("closing issue");
+		c5.setField(Field.Status, Status.Fixed);
+		assertTrue(IssueUtils.updateIssue(repository, issue.id, c5));
+
+		// retrieve issue again
+		constructed = IssueUtils.getIssue(repository, issue.id);
+
+		assertEquals(5, constructed.changes.size());
+		assertTrue(constructed.status.isClosed());
+
+		repository.close();
+	}
+
+	@Test
+	public void testQuery() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		List<IssueModel> allIssues = IssueUtils.getIssues(repository, null);
+
+		List<IssueModel> openIssues = IssueUtils.getIssues(repository, new IssueFilter() {
+			@Override
+			public boolean accept(IssueModel issue) {
+				return !issue.status.isClosed();
+			}
+		});
+
+		List<IssueModel> closedIssues = IssueUtils.getIssues(repository, new IssueFilter() {
+			@Override
+			public boolean accept(IssueModel issue) {
+				return issue.status.isClosed();
+			}
+		});
+
+		repository.close();
+		assertTrue(allIssues.size() > 0);
+		assertEquals(1, openIssues.size());
+		assertEquals(1, closedIssues.size());
+	}
+
+	@Test
+	public void testLuceneIndexAndQuery() throws Exception {		
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		LuceneUtils.deleteIndex(repository);
+		List<IssueModel> allIssues = IssueUtils.getIssues(repository, null);
+		assertTrue(allIssues.size() > 0);
+		for (IssueModel issue : allIssues) {
+			LuceneUtils.index(repository, issue, false);
+		}
+		List<SearchResult> hits = LuceneUtils.search("working", 10, repository);
+		assertTrue(hits.size() > 0);
+		
+		// reindex an issue
+		IssueModel issue = allIssues.get(0);
+		Change change = new Change("reindex");
+		change.comment("this is a test of reindexing an issue");
+		IssueUtils.updateIssue(repository, issue.id, change);
+		issue = IssueUtils.getIssue(repository, issue.id);
+		LuceneUtils.index(repository, issue, true);
+		
+		LuceneUtils.close();
+		repository.close();
+	}
+	
+	@Test
+	public void testLuceneQuery() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		List<SearchResult> hits = LuceneUtils.search("working", 10, repository);
+		LuceneUtils.close();
+		repository.close();
+		assertTrue(hits.size() > 0);
+	}
+
+
+	@Test
+	public void testDelete() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		List<IssueModel> allIssues = IssueUtils.getIssues(repository, null);
+		// delete all issues
+		for (IssueModel issue : allIssues) {
+			assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
+		}
+		repository.close();
+	}
+
+	@Test
+	public void testChangeComment() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		// C1: create the issue
+		Change c1 = newChange("testChangeComment() " + Long.toHexString(System.currentTimeMillis()));
+		IssueModel issue = IssueUtils.createIssue(repository, c1);
+		assertNotNull(issue.id);
+		assertTrue(issue.changes.get(0).hasComment());
+
+		assertTrue(IssueUtils.changeComment(repository, issue, c1, "E1", "I changed the comment"));
+		issue = IssueUtils.getIssue(repository, issue.id);
+		assertTrue(issue.changes.get(0).hasComment());
+		assertEquals("I changed the comment", issue.changes.get(0).comment.text);
+
+		assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
+
+		repository.close();
+	}
+
+	@Test
+	public void testDeleteComment() throws Exception {
+		Repository repository = GitBlitSuite.getIssuesTestRepository();
+		// C1: create the issue
+		Change c1 = newChange("testDeleteComment() " + Long.toHexString(System.currentTimeMillis()));
+		IssueModel issue = IssueUtils.createIssue(repository, c1);
+		assertNotNull(issue.id);
+		assertTrue(issue.changes.get(0).hasComment());
+
+		assertTrue(IssueUtils.deleteComment(repository, issue, c1, "D1"));
+		issue = IssueUtils.getIssue(repository, issue.id);
+		assertEquals(1, issue.changes.size());
+		assertFalse(issue.changes.get(0).hasComment());
+
+		issue = IssueUtils.getIssue(repository, issue.id, false);
+		assertEquals(2, issue.changes.size());
+		assertTrue(issue.changes.get(0).hasComment());
+		assertFalse(issue.changes.get(1).hasComment());
+
+		assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
+
+		repository.close();
+	}
+
+	private Change newChange(String summary) {
+		Change change = new Change("C1");
+		change.setField(Field.Summary, summary);
+		change.setField(Field.Description, "this is my description");
+		change.setField(Field.Priority, Priority.High);
+		change.setField(Field.Labels, "helpdesk");
+		change.comment("my comment");
+		return change;
+	}
+
+	private Attachment newAttachment() {
+		Attachment attachment = new Attachment(Long.toHexString(System.currentTimeMillis())
+				+ ".txt");
+		attachment.content = new byte[] { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+				0x4a };
+		return attachment;
+	}
+
+	private void compare(IssueModel issue, IssueModel constructed) {
+		assertEquals(issue.id, constructed.id);
+		assertEquals(issue.reporter, constructed.reporter);
+		assertEquals(issue.owner, constructed.owner);
+		assertEquals(issue.summary, constructed.summary);
+		assertEquals(issue.description, constructed.description);
+		assertEquals(issue.created, constructed.created);
+
+		assertTrue(issue.hasLabel("helpdesk"));
+	}
+}
\ No newline at end of file

--
Gitblit v1.9.1