James Moger
2012-03-23 5b29c53b326b5fd283cb06356e94df5f78508860
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;
0f43a5 37 import com.gitblit.utils.IssueUtils;
JM 38 import com.gitblit.utils.IssueUtils.IssueFilter;
3d0494 39 import com.gitblit.utils.StringUtils;
0f43a5 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();
3d0494 52         String name = StringUtils.getRelativePath(GitBlitSuite.REPOSITORIES.getAbsolutePath(),
JM 53                 repository.getDirectory().getAbsolutePath());
d3065f 54         
JM 55         // create and insert an issue
69a559 56         Change c1 = newChange("testCreation() " + Long.toHexString(System.currentTimeMillis()));
0f43a5 57         IssueModel issue = IssueUtils.createIssue(repository, c1);
JM 58         assertNotNull(issue.id);
59
60         // retrieve issue and compare
61         IssueModel constructed = IssueUtils.getIssue(repository, issue.id);
62         compare(issue, constructed);
63
69a559 64         assertEquals(1, constructed.changes.size());
d3065f 65         
69a559 66         // C1: create the issue
d3065f 67         c1 = newChange("testUpdates() " + Long.toHexString(System.currentTimeMillis()));
JM 68         issue = IssueUtils.createIssue(repository, c1);
69a559 69         assertNotNull(issue.id);
JM 70
d3065f 71         constructed = IssueUtils.getIssue(repository, issue.id);
69a559 72         compare(issue, constructed);
d3065f 73         assertEquals(1, constructed.changes.size());
69a559 74
JM 75         // C2: set owner
76         Change c2 = new Change("C2");
77         c2.comment("I'll fix this");
78         c2.setField(Field.Owner, c2.author);
0f43a5 79         assertTrue(IssueUtils.updateIssue(repository, issue.id, c2));
69a559 80         constructed = IssueUtils.getIssue(repository, issue.id);
JM 81         assertEquals(2, constructed.changes.size());
82         assertEquals(c2.author, constructed.owner);
83
84         // C3: add a note
85         Change c3 = new Change("C3");
86         c3.comment("yeah, this is working");
87         assertTrue(IssueUtils.updateIssue(repository, issue.id, c3));
88         constructed = IssueUtils.getIssue(repository, issue.id);
89         assertEquals(3, constructed.changes.size());
90
91         // C4: add attachment
92         Change c4 = new Change("C4");
93         Attachment a = newAttachment();
94         c4.addAttachment(a);
95         assertTrue(IssueUtils.updateIssue(repository, issue.id, c4));
96
97         Attachment a1 = IssueUtils.getIssueAttachment(repository, issue.id, a.name);
98         assertEquals(a.content.length, a1.content.length);
99         assertTrue(Arrays.areEqual(a.content, a1.content));
100
101         // C5: close the issue
102         Change c5 = new Change("C5");
103         c5.comment("closing issue");
104         c5.setField(Field.Status, Status.Fixed);
105         assertTrue(IssueUtils.updateIssue(repository, issue.id, c5));
0f43a5 106
JM 107         // retrieve issue again
108         constructed = IssueUtils.getIssue(repository, issue.id);
109
69a559 110         assertEquals(5, constructed.changes.size());
JM 111         assertTrue(constructed.status.isClosed());
0f43a5 112
69a559 113         List<IssueModel> allIssues = IssueUtils.getIssues(repository, null);
JM 114         List<IssueModel> openIssues = IssueUtils.getIssues(repository, new IssueFilter() {
0f43a5 115             @Override
JM 116             public boolean accept(IssueModel issue) {
69a559 117                 return !issue.status.isClosed();
0f43a5 118             }
JM 119         });
69a559 120         List<IssueModel> closedIssues = IssueUtils.getIssues(repository, new IssueFilter() {
JM 121             @Override
122             public boolean accept(IssueModel issue) {
123                 return issue.status.isClosed();
124             }
125         });
d896e6 126         
69a559 127         assertTrue(allIssues.size() > 0);
JM 128         assertEquals(1, openIssues.size());
129         assertEquals(1, closedIssues.size());
d3065f 130         
JM 131         // build a new Lucene index
d896e6 132         LuceneExecutor lucene = new LuceneExecutor(null, GitBlitSuite.REPOSITORIES);
JM 133         lucene.deleteIndex(name);
d3065f 134         for (IssueModel anIssue : allIssues) {
d896e6 135             lucene.index(name, anIssue);
06ff61 136         }
d04009 137         List<SearchResult> hits = lucene.search("working", 1, 10, name);
06ff61 138         assertTrue(hits.size() > 0);
JM 139         
140         // reindex an issue
d3065f 141         issue = allIssues.get(0);
06ff61 142         Change change = new Change("reindex");
JM 143         change.comment("this is a test of reindexing an issue");
144         IssueUtils.updateIssue(repository, issue.id, change);
145         issue = IssueUtils.getIssue(repository, issue.id);
d896e6 146         lucene.index(name, issue);
d3065f 147
JM 148         // delete all issues
149         for (IssueModel anIssue : allIssues) {
150             assertTrue(IssueUtils.deleteIssue(repository, anIssue.id, "D"));
151         }
152                 
d896e6 153         lucene.close();
06ff61 154         repository.close();
JM 155     }
156     
69a559 157     @Test
JM 158     public void testChangeComment() throws Exception {
159         Repository repository = GitBlitSuite.getIssuesTestRepository();
160         // C1: create the issue
161         Change c1 = newChange("testChangeComment() " + Long.toHexString(System.currentTimeMillis()));
162         IssueModel issue = IssueUtils.createIssue(repository, c1);
163         assertNotNull(issue.id);
164         assertTrue(issue.changes.get(0).hasComment());
165
166         assertTrue(IssueUtils.changeComment(repository, issue, c1, "E1", "I changed the comment"));
167         issue = IssueUtils.getIssue(repository, issue.id);
168         assertTrue(issue.changes.get(0).hasComment());
169         assertEquals("I changed the comment", issue.changes.get(0).comment.text);
170
171         assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
172
173         repository.close();
174     }
175
176     @Test
177     public void testDeleteComment() throws Exception {
178         Repository repository = GitBlitSuite.getIssuesTestRepository();
179         // C1: create the issue
180         Change c1 = newChange("testDeleteComment() " + Long.toHexString(System.currentTimeMillis()));
181         IssueModel issue = IssueUtils.createIssue(repository, c1);
182         assertNotNull(issue.id);
183         assertTrue(issue.changes.get(0).hasComment());
184
185         assertTrue(IssueUtils.deleteComment(repository, issue, c1, "D1"));
186         issue = IssueUtils.getIssue(repository, issue.id);
187         assertEquals(1, issue.changes.size());
188         assertFalse(issue.changes.get(0).hasComment());
189
190         issue = IssueUtils.getIssue(repository, issue.id, false);
191         assertEquals(2, issue.changes.size());
192         assertTrue(issue.changes.get(0).hasComment());
193         assertFalse(issue.changes.get(1).hasComment());
194
195         assertTrue(IssueUtils.deleteIssue(repository, issue.id, "D"));
196
197         repository.close();
0f43a5 198     }
JM 199
200     private Change newChange(String summary) {
69a559 201         Change change = new Change("C1");
0f43a5 202         change.setField(Field.Summary, summary);
JM 203         change.setField(Field.Description, "this is my description");
204         change.setField(Field.Priority, Priority.High);
205         change.setField(Field.Labels, "helpdesk");
206         change.comment("my comment");
207         return change;
69a559 208     }
JM 209
210     private Attachment newAttachment() {
211         Attachment attachment = new Attachment(Long.toHexString(System.currentTimeMillis())
212                 + ".txt");
213         attachment.content = new byte[] { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
214                 0x4a };
215         return attachment;
0f43a5 216     }
JM 217
218     private void compare(IssueModel issue, IssueModel constructed) {
219         assertEquals(issue.id, constructed.id);
220         assertEquals(issue.reporter, constructed.reporter);
221         assertEquals(issue.owner, constructed.owner);
222         assertEquals(issue.summary, constructed.summary);
223         assertEquals(issue.description, constructed.description);
69a559 224         assertEquals(issue.created, constructed.created);
0f43a5 225
JM 226         assertTrue(issue.hasLabel("helpdesk"));
227     }
228 }