James Moger
2012-10-01 eb1405f736f2f98e14215774dd53eea9b9a77017
commit | author | age
0f43a5 1 /*
JM 2  * Copyright 2012 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit.tests;
17
18 import static org.junit.Assert.assertEquals;
69a559 19 import static org.junit.Assert.assertFalse;
0f43a5 20 import static org.junit.Assert.assertNotNull;
JM 21 import static org.junit.Assert.assertTrue;
22
23 import java.util.List;
24
25 import org.bouncycastle.util.Arrays;
26 import org.eclipse.jgit.lib.Repository;
27 import org.junit.Test;
28
d896e6 29 import com.gitblit.LuceneExecutor;
0f43a5 30 import com.gitblit.models.IssueModel;
JM 31 import com.gitblit.models.IssueModel.Attachment;
32 import com.gitblit.models.IssueModel.Change;
33 import com.gitblit.models.IssueModel.Field;
34 import com.gitblit.models.IssueModel.Priority;
69a559 35 import com.gitblit.models.IssueModel.Status;
06ff61 36 import com.gitblit.models.SearchResult;
1aa6e0 37 import com.gitblit.utils.FileUtils;
0f43a5 38 import com.gitblit.utils.IssueUtils;
JM 39 import com.gitblit.utils.IssueUtils.IssueFilter;
40
69a559 41 /**
JM 42  * Tests the mechanics of distributed issue management on the gb-issues branch.
43  * 
44  * @author James Moger
45  * 
46  */
0f43a5 47 public class IssuesTest {
JM 48
49     @Test
d3065f 50     public void testLifecycle() throws Exception {
0f43a5 51         Repository repository = GitBlitSuite.getIssuesTestRepository();
1aa6e0 52         String name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory());
d3065f 53         
JM 54         // create and insert an issue
69a559 55         Change c1 = newChange("testCreation() " + Long.toHexString(System.currentTimeMillis()));
0f43a5 56         IssueModel issue = IssueUtils.createIssue(repository, c1);
JM 57         assertNotNull(issue.id);
58
59         // retrieve issue and compare
60         IssueModel constructed = IssueUtils.getIssue(repository, issue.id);
61         compare(issue, constructed);
62
69a559 63         assertEquals(1, constructed.changes.size());
d3065f 64         
69a559 65         // C1: create the issue
d3065f 66         c1 = newChange("testUpdates() " + Long.toHexString(System.currentTimeMillis()));
JM 67         issue = IssueUtils.createIssue(repository, c1);
69a559 68         assertNotNull(issue.id);
JM 69
d3065f 70         constructed = IssueUtils.getIssue(repository, issue.id);
69a559 71         compare(issue, constructed);
d3065f 72         assertEquals(1, constructed.changes.size());
69a559 73
JM 74         // C2: set owner
75         Change c2 = new Change("C2");
76         c2.comment("I'll fix this");
77         c2.setField(Field.Owner, c2.author);
0f43a5 78         assertTrue(IssueUtils.updateIssue(repository, issue.id, c2));
69a559 79         constructed = IssueUtils.getIssue(repository, issue.id);
JM 80         assertEquals(2, constructed.changes.size());
81         assertEquals(c2.author, constructed.owner);
82
83         // C3: add a note
84         Change c3 = new Change("C3");
85         c3.comment("yeah, this is working");
86         assertTrue(IssueUtils.updateIssue(repository, issue.id, c3));
87         constructed = IssueUtils.getIssue(repository, issue.id);
88         assertEquals(3, constructed.changes.size());
89
90         // C4: add attachment
91         Change c4 = new Change("C4");
92         Attachment a = newAttachment();
93         c4.addAttachment(a);
94         assertTrue(IssueUtils.updateIssue(repository, issue.id, c4));
95
96         Attachment a1 = IssueUtils.getIssueAttachment(repository, issue.id, a.name);
97         assertEquals(a.content.length, a1.content.length);
98         assertTrue(Arrays.areEqual(a.content, a1.content));
99
100         // C5: close the issue
101         Change c5 = new Change("C5");
102         c5.comment("closing issue");
103         c5.setField(Field.Status, Status.Fixed);
104         assertTrue(IssueUtils.updateIssue(repository, issue.id, c5));
0f43a5 105
JM 106         // retrieve issue again
107         constructed = IssueUtils.getIssue(repository, issue.id);
108
69a559 109         assertEquals(5, constructed.changes.size());
JM 110         assertTrue(constructed.status.isClosed());
0f43a5 111
69a559 112         List<IssueModel> allIssues = IssueUtils.getIssues(repository, null);
JM 113         List<IssueModel> openIssues = IssueUtils.getIssues(repository, new IssueFilter() {
0f43a5 114             @Override
JM 115             public boolean accept(IssueModel issue) {
69a559 116                 return !issue.status.isClosed();
0f43a5 117             }
JM 118         });
69a559 119         List<IssueModel> closedIssues = IssueUtils.getIssues(repository, new IssueFilter() {
JM 120             @Override
121             public boolean accept(IssueModel issue) {
122                 return issue.status.isClosed();
123             }
124         });
d896e6 125         
69a559 126         assertTrue(allIssues.size() > 0);
JM 127         assertEquals(1, openIssues.size());
128         assertEquals(1, closedIssues.size());
d3065f 129         
JM 130         // build a new Lucene index
d896e6 131         LuceneExecutor lucene = new LuceneExecutor(null, GitBlitSuite.REPOSITORIES);
JM 132         lucene.deleteIndex(name);
d3065f 133         for (IssueModel anIssue : allIssues) {
d896e6 134             lucene.index(name, anIssue);
06ff61 135         }
d04009 136         List<SearchResult> hits = lucene.search("working", 1, 10, name);
87ee94 137         assertTrue(hits.size() == 1);
06ff61 138         
JM 139         // reindex an issue
d3065f 140         issue = allIssues.get(0);
06ff61 141         Change change = new Change("reindex");
JM 142         change.comment("this is a test of reindexing an issue");
143         IssueUtils.updateIssue(repository, issue.id, change);
144         issue = IssueUtils.getIssue(repository, issue.id);
d896e6 145         lucene.index(name, issue);
d3065f 146
87ee94 147         hits = lucene.search("working", 1, 10, name);
JM 148         assertTrue(hits.size() == 1);
149
150         
d3065f 151         // delete all issues
JM 152         for (IssueModel anIssue : allIssues) {
153             assertTrue(IssueUtils.deleteIssue(repository, anIssue.id, "D"));
154         }
155                 
d896e6 156         lucene.close();
06ff61 157         repository.close();
JM 158     }
159     
69a559 160     @Test
JM 161     public void testChangeComment() throws Exception {
162         Repository repository = GitBlitSuite.getIssuesTestRepository();
163         // C1: create the issue
164         Change c1 = newChange("testChangeComment() " + Long.toHexString(System.currentTimeMillis()));
165         IssueModel issue = IssueUtils.createIssue(repository, c1);
166         assertNotNull(issue.id);
167         assertTrue(issue.changes.get(0).hasComment());
168
169         assertTrue(IssueUtils.changeComment(repository, issue, c1, "E1", "I changed the comment"));
170         issue = IssueUtils.getIssue(repository, issue.id);
171         assertTrue(issue.changes.get(0).hasComment());
172         assertEquals("I changed the comment", issue.changes.get(0).comment.text);
173
174         assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
175
176         repository.close();
177     }
178
179     @Test
180     public void testDeleteComment() throws Exception {
181         Repository repository = GitBlitSuite.getIssuesTestRepository();
182         // C1: create the issue
183         Change c1 = newChange("testDeleteComment() " + Long.toHexString(System.currentTimeMillis()));
184         IssueModel issue = IssueUtils.createIssue(repository, c1);
185         assertNotNull(issue.id);
186         assertTrue(issue.changes.get(0).hasComment());
187
188         assertTrue(IssueUtils.deleteComment(repository, issue, c1, "D1"));
189         issue = IssueUtils.getIssue(repository, issue.id);
190         assertEquals(1, issue.changes.size());
191         assertFalse(issue.changes.get(0).hasComment());
192
193         issue = IssueUtils.getIssue(repository, issue.id, false);
194         assertEquals(2, issue.changes.size());
195         assertTrue(issue.changes.get(0).hasComment());
196         assertFalse(issue.changes.get(1).hasComment());
197
198         assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
199
200         repository.close();
0f43a5 201     }
JM 202
203     private Change newChange(String summary) {
69a559 204         Change change = new Change("C1");
0f43a5 205         change.setField(Field.Summary, summary);
JM 206         change.setField(Field.Description, "this is my description");
207         change.setField(Field.Priority, Priority.High);
208         change.setField(Field.Labels, "helpdesk");
209         change.comment("my comment");
210         return change;
69a559 211     }
JM 212
213     private Attachment newAttachment() {
214         Attachment attachment = new Attachment(Long.toHexString(System.currentTimeMillis())
215                 + ".txt");
216         attachment.content = new byte[] { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
217                 0x4a };
218         return attachment;
0f43a5 219     }
JM 220
221     private void compare(IssueModel issue, IssueModel constructed) {
222         assertEquals(issue.id, constructed.id);
223         assertEquals(issue.reporter, constructed.reporter);
224         assertEquals(issue.owner, constructed.owner);
225         assertEquals(issue.summary, constructed.summary);
226         assertEquals(issue.description, constructed.description);
69a559 227         assertEquals(issue.created, constructed.created);
0f43a5 228
JM 229         assertTrue(issue.hasLabel("helpdesk"));
230     }
231 }