1 /**
2 * Copyright (c) 2013-2023, jcabi.com
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met: 1) Redistributions of source code must retain the above
8 * copyright notice, this list of conditions and the following
9 * disclaimer. 2) Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution. 3) Neither the name of the jcabi.com nor
13 * the names of its contributors may be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package com.jcabi.github.mock;
31
32 import com.jcabi.github.User;
33 import com.jcabi.github.UserOrganizations;
34 import java.io.IOException;
35 import java.time.Instant;
36 import java.time.temporal.ChronoUnit;
37 import java.util.Date;
38 import org.hamcrest.MatcherAssert;
39 import org.hamcrest.Matchers;
40 import org.junit.Test;
41 import org.xembly.Directives;
42
43 /**
44 * Unit tests for the MkUser class.
45 *
46 * @author Ed Hillmann (edhillmann@yahoo.com)
47 * @version $Id: 45b760061125f834c59eff4d52a406743ce94721 $
48 * @checkstyle MultipleStringLiteralsCheck (200 lines)
49 */
50 public final class MkUserTest {
51
52 /**
53 * Tests that MkUser.organizations() returns a value.
54 *
55 * @throws IOException when there is an error creating the MkUser begin tested
56 */
57 @Test
58 public void testGetOrganizations() throws IOException {
59 final MkUser user = new MkUser(
60 new MkStorage.InFile(),
61 "orgTestIterate"
62 );
63 final UserOrganizations orgs = user.organizations();
64 MatcherAssert.assertThat(
65 orgs,
66 Matchers.notNullValue()
67 );
68 }
69
70 /**
71 * MkUser returns notifications.
72 * <p>
73 * There is no requirement for us to return actual mock data because our
74 * API does not provide a way to create notifications.
75 * @throws IOException If there is an error creating the user.
76 */
77 @Test
78 public void returnsNotifications() throws IOException {
79 MatcherAssert.assertThat(
80 new MkUser(
81 new MkStorage.InFile(),
82 "notifications"
83 ).notifications(),
84 Matchers.notNullValue()
85 );
86 }
87
88 /**
89 * Must mark notifications as read only if their 'lastread' is equal or
90 * older than the given date.
91 * @throws IOException If any error occurs.
92 */
93 @Test
94 public void marksNotificationsAsReadUpToDate() throws IOException {
95 final MkStorage storage = new MkStorage.InFile();
96 storage.apply(new Directives().xpath("/github").add("users"));
97 final User user = new MkUsers(storage, "joe").add("joe");
98 final Instant upto = Instant.now();
99 storage.apply(
100 new Directives()
101 .xpath("//notifications")
102 .add("notification")
103 .add("id").set(1).up()
104 .add("date").set(
105 // @checkstyle MagicNumberCheck (1 line)
106 upto.minus(30, ChronoUnit.MINUTES).toEpochMilli()
107 ).up()
108 .add("read").set(false).up()
109 .up()
110 .add("notification")
111 .add("id").set(2).up()
112 .add("date").set(
113 // @checkstyle MagicNumberCheck (1 line)
114 upto.plus(30, ChronoUnit.MINUTES).toEpochMilli()
115 ).up()
116 .add("read").set(false).up()
117 .up()
118 );
119 user.markAsRead(Date.from(upto));
120 MatcherAssert.assertThat(
121 storage.xml().xpath("//notification[id = 1]/read/text()").get(0),
122 Matchers.is("true")
123 );
124 MatcherAssert.assertThat(
125 storage.xml().xpath("//notification[id = 2]/read/text()").get(0),
126 Matchers.is("false")
127 );
128 }
129 }