View Javadoc

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         // given
106         final AuditRecordsData firstPageOfRecords = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
107 
108         // when
109         final int offset = 1;
110         final AuditRecordsData offsetedAuditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(offset, null, null, null, null)).claim();
111 
112         // then
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         // given
123         final AuditRecordsData firstPageOfRecords = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, null, null, null, null)).claim();
124 
125         // when
126         final int limit = 1;
127         final AuditRecordsData limitedAuditRecordsData = client.getAuditRestClient().getAuditRecords(new AuditRecordSearchInput(null, limit, null, null, null)).claim();
128 
129         // then
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         // given
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         // when
171         final Iterable<AuditRecord> auditRecords = auditRestClient.
172                 getAuditRecords(new AuditRecordSearchInput(null, numberOfAddedRecords, null, null, null))
173                 .claim()
174                 .getRecords();
175 
176         // then
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         // given
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         // when
236         final AuditRecordSearchInput toLatestSearchCriteria = new AuditRecordSearchInput(null, null, null, null, latestCreatedDate);
237         final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(toLatestSearchCriteria).claim();
238 
239         // then
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         // when
251         final AuditRecordSearchInput fromLatestSearchCriteria = new AuditRecordSearchInput(null, null, null, latestCreatedDateInStrangeTimezone, null);
252         final AuditRecordsData auditRecordsData = client.getAuditRestClient().getAuditRecords(fromLatestSearchCriteria).claim();
253 
254         // then
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 }