/* * 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.LuceneExecutor; 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.FileUtils; import com.gitblit.utils.IssueUtils; import com.gitblit.utils.IssueUtils.IssueFilter; /** * Tests the mechanics of distributed issue management on the gb-issues branch. * * @author James Moger * */ public class IssuesTest { @Test public void testLifecycle() throws Exception { Repository repository = GitBlitSuite.getIssuesTestRepository(); String name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory()); // create and insert an 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()); // C1: create the issue c1 = newChange("testUpdates() " + Long.toHexString(System.currentTimeMillis())); issue = IssueUtils.createIssue(repository, c1); assertNotNull(issue.id); constructed = IssueUtils.getIssue(repository, issue.id); compare(issue, constructed); assertEquals(1, constructed.changes.size()); // 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()); List allIssues = IssueUtils.getIssues(repository, null); List openIssues = IssueUtils.getIssues(repository, new IssueFilter() { @Override public boolean accept(IssueModel issue) { return !issue.status.isClosed(); } }); List closedIssues = IssueUtils.getIssues(repository, new IssueFilter() { @Override public boolean accept(IssueModel issue) { return issue.status.isClosed(); } }); assertTrue(allIssues.size() > 0); assertEquals(1, openIssues.size()); assertEquals(1, closedIssues.size()); // build a new Lucene index LuceneExecutor lucene = new LuceneExecutor(null, GitBlitSuite.REPOSITORIES); lucene.deleteIndex(name); for (IssueModel anIssue : allIssues) { lucene.index(name, anIssue); } List hits = lucene.search("working", 1, 10, name); assertTrue(hits.size() == 1); // reindex an issue 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); lucene.index(name, issue); hits = lucene.search("working", 1, 10, name); assertTrue(hits.size() == 1); // delete all issues for (IssueModel anIssue : allIssues) { assertTrue(IssueUtils.deleteIssue(repository, anIssue.id, "D")); } lucene.close(); 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")); } }