1 package it;
2
3 import com.atlassian.jira.nimblefunctests.annotation.JiraBuildNumberDependent;
4 import com.atlassian.jira.rest.client.IntegrationTestUtil;
5 import com.atlassian.jira.rest.client.api.AuditRestClient;
6 import com.atlassian.jira.rest.client.api.domain.AuditAssociatedItem;
7 import com.atlassian.jira.rest.client.api.domain.AuditChangedValue;
8 import com.atlassian.jira.rest.client.api.domain.AuditRecord;
9 import com.atlassian.jira.rest.client.api.domain.AuditRecordsData;
10 import com.atlassian.jira.rest.client.api.domain.Component;
11 import com.atlassian.jira.rest.client.api.domain.input.AuditRecordBuilder;
12 import com.atlassian.jira.rest.client.api.domain.input.AuditRecordSearchInput;
13 import com.atlassian.jira.rest.client.api.domain.input.ComponentInput;
14 import com.atlassian.jira.rest.client.internal.ServerVersionConstants;
15 import com.atlassian.jira.rest.client.internal.json.TestConstants;
16 import com.google.common.base.Function;
17 import com.google.common.base.Predicate;
18 import com.google.common.collect.ImmutableList;
19 import com.google.common.collect.Iterables;
20 import com.google.common.collect.Lists;
21 import com.google.common.collect.Ordering;
22 import org.hamcrest.BaseMatcher;
23 import org.hamcrest.Description;
24 import org.hamcrest.Matcher;
25 import org.hamcrest.Matchers;
26 import org.hamcrest.collection.IsIterableWithSize;
27 import org.joda.time.DateMidnight;
28 import org.joda.time.DateTime;
29 import org.joda.time.DateTimeZone;
30 import org.joda.time.Period;
31 import org.junit.Before;
32 import org.junit.Test;
33
34 import javax.annotation.Nullable;
35 import java.util.Iterator;
36 import java.util.List;
37
38 import static org.hamcrest.Matchers.contains;
39 import static org.hamcrest.Matchers.hasSize;
40 import static org.hamcrest.core.Is.is;
41 import static org.hamcrest.core.IsNull.notNullValue;
42 import static org.hamcrest.core.IsNull.nullValue;
43 import static org.junit.Assert.assertNotNull;
44 import static org.junit.Assert.assertThat;
45
46 public class AsynchronousAuditRestClientTest extends AbstractAsynchronousRestClientTest {
47
48 private static boolean alreadyRestored;
49
50 @Before
51 public void setup() {
52 if (!alreadyRestored) {
53 IntegrationTestUtil.restoreAppropriateJiraData(TestConstants.DEFAULT_JIRA_DUMP_FILE, administration);
54 alreadyRestored = true;
55 }
56 }
57
58 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
59 @Test
60 public void testGetRecords() {
61
62 final Component component = client.getComponentClient().createComponent("TST", new ComponentInput("New TST Component", null, null, null)).claim();
63 assertNotNull(component);
64
65 final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
66 final Iterable<AuditRecord> filterResult = Iterables.filter(auditRecordsData.getRecords(), new Predicate<AuditRecord>() {
67 @Override
68 public boolean apply(final AuditRecord input) {
69 return input.getSummary().equals("Project component created") &&
70 input.getObjectItem().getName().equals("New TST Component");
71 }
72 });
73
74 final Iterator<AuditRecord> iterator = filterResult.iterator();
75 assertThat(iterator.hasNext(), is(true));
76 final AuditRecord record = iterator.next();
77 assertThat(record.getAuthorKey(), is("admin"));
78 assertThat(record.getObjectItem().getTypeName(), is("PROJECT_COMPONENT"));
79 assertThat(record.getCreated(), is(Matchers.notNullValue()));
80
81 final Iterator<AuditAssociatedItem> itemIterator = record.getAssociatedItems().iterator();
82 final AuditAssociatedItem item1 = itemIterator.next();
83 assertThat(item1.getName(), is("Test Project"));
84 assertThat(item1.getTypeName(), is("PROJECT"));
85
86 final AuditAssociatedItem item2 = itemIterator.next();
87 assertThat(item2.getName(), is("admin"));
88 assertThat(item2.getTypeName(), is("USER"));
89 assertThat(item2.getParentId(), is("1"));
90 assertThat(item2.getParentName(), is("JIRA Internal Directory"));
91
92 final Iterator<AuditChangedValue> valuesIterator = record.getChangedValues().iterator();
93 final AuditChangedValue value1 = valuesIterator.next();
94 assertThat(value1.getFieldName(), is("Name"));
95 assertThat(value1.getChangedTo(), is("New TST Component"));
96
97 final AuditChangedValue value2 = valuesIterator.next();
98 assertThat(value2.getFieldName(), is("Default Assignee"));
99 assertThat(value2.getChangedTo(), is("Project Default"));
100 }
101
102 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
103 @Test
104 public void testGetRecordsWithOffset() {
105
106 final AuditRecordsData firstPageOfRecords = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
107
108
109 final int offset = 1;
110 final AuditRecordsData offsetedAuditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(offset, null, null, null, null)).claim();
111
112
113 final List<AuditRecord> offsetedAuditRecords = Lists.newArrayList(offsetedAuditRecordsData.getRecords());
114 final List<AuditRecord> allAuditRecords = Lists.newArrayList(firstPageOfRecords.getRecords());
115 assertThat(offsetedAuditRecords, hasSize(allAuditRecords.size() - offset));
116 assertThat(offsetedAuditRecords.get(0), auditRecordWithId(allAuditRecords.get(offset).getId()));
117 }
118
119 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
120 @Test
121 public void testGetRecordsWithLimit() {
122
123 final AuditRecordsData firstPageOfRecords = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
124
125
126 final int limit = 1;
127 final AuditRecordsData limitedAuditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, limit, null, null, null)).claim();
128
129
130 final List<AuditRecord> limitedAuditRecords = Lists.newArrayList(limitedAuditRecordsData.getRecords());
131 assertThat(limitedAuditRecords, hasSize(limit));
132 final AuditRecord record = limitedAuditRecords.get(0);
133 assertThat(record, auditRecordWithId(Iterables.get(firstPageOfRecords.getRecords(), 0).getId()));
134 }
135
136 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
137 @Test
138 public void testGetRecordsWithFilter() {
139 final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, "reporter", null, null)).claim();
140 assertThat(Iterables.size(auditRecordsData.getRecords()), is(1));
141
142 final AuditRecord record = auditRecordsData.getRecords().iterator().next();
143 assertThat(record.getId(), is(10001L));
144 }
145
146 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
147 @Test
148 public void testAddSimpleRecord() {
149
150 final AuditRestClient auditRestClient = client.getAuditRestClient();
151
152 ImmutableList<AuditAssociatedItem> items = ImmutableList.of(
153 new AuditAssociatedItem("", "admin", "USER", null, null),
154 new AuditAssociatedItem("123", "Internal item", "PROJECT", null, ""));
155 auditRestClient
156 .addAuditRecord(new AuditRecordBuilder("user management", "Event with associated items")
157 .setAssociatedItems(items)
158 .build());
159
160 ImmutableList<AuditChangedValue> changedValues = ImmutableList.of(new AuditChangedValue("Test", "to", "from"));
161 auditRestClient
162 .addAuditRecord(new AuditRecordBuilder("user management", "Event with changed values")
163 .setChangedValues(changedValues)
164 .build());
165
166 auditRestClient
167 .addAuditRecord(new AuditRecordBuilder("user management", "Adding new event").build());
168 final int numberOfAddedRecords = 3;
169
170
171 final Iterable<AuditRecord> auditRecords = auditRestClient.
172 getAuditRecords(new AuditRecordSearchInput(null, numberOfAddedRecords, null, null, null))
173 .claim()
174 .getRecords();
175
176
177 assertThat(auditRecords, IsIterableWithSize.<AuditRecord>iterableWithSize(numberOfAddedRecords));
178 AuditRecord record = Iterables.get(auditRecords, 0);
179 assertThat(record.getSummary(), is("Adding new event"));
180 assertThat(record.getCategory(), is("user management"));
181 assertThat(record.getObjectItem(), nullValue());
182 assertThat(record.getAssociatedItems().isSupported(), is(false));
183 assertThat(record.getAuthorKey(), is("admin"));
184 assertThat(record.getChangedValues(), IsIterableWithSize.<AuditChangedValue>iterableWithSize(0));
185 assertThat(record.getRemoteAddress(), notNullValue());
186 assertThat(record.getCreated(), notNullValue());
187
188 record = Iterables.get(auditRecords, 1);
189 assertThat(record.getSummary(), is("Event with changed values"));
190 assertThat(record.getAssociatedItems().isSupported(), is(false));
191 assertThat(record.getChangedValues(), IsIterableWithSize.<AuditChangedValue>iterableWithSize(1));
192 AuditChangedValue value = Iterables.get(record.getChangedValues(), 0);
193 assertThat(value.getChangedFrom(), is("from"));
194 assertThat(value.getChangedTo(), is("to"));
195 assertThat(value.getFieldName(), is("Test"));
196
197 record = Iterables.get(auditRecords, 2);
198 assertThat(record.getSummary(), is("Event with associated items"));
199 assertThat(record.getAssociatedItems(), IsIterableWithSize.<AuditAssociatedItem>iterableWithSize(2));
200 assertThat(record.getChangedValues(), IsIterableWithSize.<AuditChangedValue>iterableWithSize(0));
201
202 AuditAssociatedItem item = Iterables.get(record.getAssociatedItems(), 0);
203 assertThat(item.getId(), nullValue());
204 assertThat(item.getName(), is("admin"));
205 assertThat(item.getParentId(), nullValue());
206 assertThat(item.getParentName(), nullValue());
207 assertThat(item.getTypeName(), is("USER"));
208
209 item = Iterables.get(record.getAssociatedItems(), 1);
210 assertThat(item.getId(), is("123"));
211 assertThat(item.getName(), is("Internal item"));
212 assertThat(item.getParentId(), nullValue());
213 assertThat(item.getParentName(), nullValue());
214 assertThat(item.getTypeName(), is("PROJECT"));
215 }
216
217 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
218 @Test
219 public void shouldReturnNoRecordsWhenFilteringForTomorrow() {
220 final DateTime tomorrow = new DateMidnight().plus(Period.days(1)).toDateTime();
221
222 final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, tomorrow, tomorrow)).claim();
223
224 assertThat(auditRecordsData.getRecords(), Matchers.<AuditRecord>emptyIterable());
225 }
226
227 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
228 @Test
229 public void shouldReturnAllRecordsWhenFilteringToLatestCreationDate() {
230
231 final AuditRecordsData firstPageOfRecords = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
232 final AuditRecord latestCreatedRecord = getLatestCreatedRecord(firstPageOfRecords);
233 final DateTime latestCreatedDate = latestCreatedRecord.getCreated();
234
235
236 final AuditRecordSearchInput toLatestSearchCriteria = new AuditRecordSearchInput(null, null, null, null, latestCreatedDate);
237 final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(toLatestSearchCriteria).claim();
238
239
240 assertThat(auditRecordsData.getRecords(), hasSameIdsAs(firstPageOfRecords.getRecords()));
241 }
242
243 @JiraBuildNumberDependent(ServerVersionConstants.BN_JIRA_6_3)
244 @Test
245 public void shouldReturnLatestItemWhenFilteringFromLatestCreationDate() {
246 final AuditRecord latestCreatedRecord = getLatestCreatedRecord();
247 final DateTime latestCreatedDate = latestCreatedRecord.getCreated();
248 final DateTime latestCreatedDateInStrangeTimezone = latestCreatedDate.toDateTime(DateTimeZone.forOffsetHours(-5));
249
250
251 final AuditRecordSearchInput fromLatestSearchCriteria = new AuditRecordSearchInput(null, null, null, latestCreatedDateInStrangeTimezone, null);
252 final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(fromLatestSearchCriteria).claim();
253
254
255 assertThat(auditRecordsData.getRecords(), Matchers.<AuditRecord>hasItem(auditRecordWithId(latestCreatedRecord.getId())));
256 }
257
258 private Matcher<AuditRecord> auditRecordWithId(final Long expectedId) {
259 return new BaseMatcher<AuditRecord>() {
260 @Override
261 public boolean matches(Object o) {
262 AuditRecord current = (AuditRecord) o;
263 return current.getId().equals(expectedId);
264 }
265
266 @Override
267 public void describeTo(Description description) {
268 description.appendText("Contains item with id: " + expectedId);
269 }
270 };
271 }
272
273 private Matcher<Iterable<? extends AuditRecord>> hasSameIdsAs(final Iterable<AuditRecord> auditLogRecords) {
274 final List<Matcher<? super AuditRecord>> existingIdsMatchers = Lists.newArrayList(Iterables.transform(auditLogRecords, new Function<AuditRecord, Matcher<? super AuditRecord>>() {
275 @Override
276 public Matcher<AuditRecord> apply(final AuditRecord auditRecord) {
277 return auditRecordWithId(auditRecord.getId());
278 }
279 }));
280 return contains(existingIdsMatchers);
281 }
282
283 private AuditRecord getLatestCreatedRecord() {
284 final AuditRecordsData allAuditRecordData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
285
286 return getLatestCreatedRecord(allAuditRecordData);
287 }
288
289 private AuditRecord getLatestCreatedRecord(final AuditRecordsData allAuditRecordData) {
290 final Ordering<AuditRecord> createdTimeAscendingOrdering = new Ordering<AuditRecord>() {
291 @Override
292 public int compare(@Nullable AuditRecord left, @Nullable AuditRecord right) {
293 final DateTime leftCreatedTime = left.getCreated();
294 final DateTime rightCreatedTime = right.getCreated();
295
296 return leftCreatedTime.compareTo(rightCreatedTime);
297 }
298 };
299 final AuditRecord latestAuditRecord = createdTimeAscendingOrdering.max(allAuditRecordData.getRecords());
300
301 return latestAuditRecord;
302 }
303 }