From 4b4f9337fbf838d6c6900aef609dc3c416e9803f Mon Sep 17 00:00:00 2001 From: Thomas <1688389+Rakambda@users.noreply.github.com> Date: Mon, 23 Oct 2023 20:04:01 +0200 Subject: [PATCH] 2.2.10 (#624) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): bump org.apache.logging.log4j:log4j-slf4j2-impl (#614) Bumps org.apache.logging.log4j:log4j-slf4j2-impl from 2.20.0 to 2.21.0. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-slf4j2-impl dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump org.apache.logging.log4j:log4j-core (#615) Bumps org.apache.logging.log4j:log4j-core from 2.20.0 to 2.21.0. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Thomas <1688389+Rakambda@users.noreply.github.com> * 🔄 synced file(s) with RakambdaOrg/rakambda-github-files (#616) Co-authored-by: undefined * chore(deps): bump com.codeborne:selenide from 6.19.0 to 6.19.1 (#617) Bumps [com.codeborne:selenide](https://github.com/selenide/selenide) from 6.19.0 to 6.19.1. - [Release notes](https://github.com/selenide/selenide/releases) - [Changelog](https://github.com/selenide/selenide/blob/main/CHANGELOG.md) - [Commits](https://github.com/selenide/selenide/compare/v6.19.0...v6.19.1) --- updated-dependencies: - dependency-name: com.codeborne:selenide dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump org.xerial:sqlite-jdbc from 3.43.2.0 to 3.43.2.1 (#618) Bumps [org.xerial:sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.43.2.0 to 3.43.2.1. - [Release notes](https://github.com/xerial/sqlite-jdbc/releases) - [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG) - [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.43.2.0...3.43.2.1) --- updated-dependencies: - dependency-name: org.xerial:sqlite-jdbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump org.springframework.boot from 3.1.4 to 3.1.5 (#619) Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.1.4...v3.1.5) --- updated-dependencies: - dependency-name: org.springframework.boot dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix: Send more data to MinuteWatched to make drops progress & Unrecognized field "count_by_md" (#622) * Fix: send more data to minute watched event See: https://github.com/rdavydov/Twitch-Channel-Points-Miner-v2/pull/378 * tests * Refactor * Fix for #623 * Bump version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Thomas --- .github/dependabot.yml | 5 +++ gradle.properties | 2 +- gradle/libs.versions.toml | 10 +++--- .../twitch/data/MinuteWatchedProperties.java | 20 +++++++---- .../api/ws/data/message/subtype/Summary.java | 5 +++ .../channelpointsminer/miner/miner/Miner.java | 7 ++-- .../miner/runnable/SendMinutesWatched.java | 3 ++ .../miner/util/json/UnknownDeserializer.java | 2 +- .../miner/api/twitch/TwitchApiTest.java | 27 +++++++++----- .../runnable/SendMinutesWatchedTest.java | 36 +++++++++++++++---- 10 files changed, 87 insertions(+), 30 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fe2d8f00..92a09bc9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -18,6 +18,11 @@ updates: timezone: "Europe/Paris" pull-request-branch-name: separator: "-" + groups: + log4j: + patterns: + - "org.apache.logging.log4j:log4j-core" + - "org.apache.logging.log4j:log4j-slf4j2-impl" # Disable while paths can't be ignored as it'd update all 'auto-approve-sync-files.yml', Renovate will handle exclusion # - package-ecosystem: "github-actions" # directory: "/" diff --git a/gradle.properties b/gradle.properties index f2f5e56d..a2aaa282 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=2.2.9 +version=2.2.10 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5e1f8326..8eb1b942 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] slf4j-version = "2.0.9" -log4j2-version = "2.20.0" -log4j2-slf4j-version = "2.20.0" +log4j2-version = "2.21.0" +log4j2-slf4j-version = "2.21.0" unirest-version = "4.1.0" picocli-version = "4.7.5" jackson-version = "2.15.3" @@ -20,11 +20,11 @@ json-unit-version = "3.2.2" kitteh-irc-version = "8.0.0" hikari-cp-version = "5.0.1" mariadb-version = "3.2.0" -sqlite-version = "3.43.2.0" +sqlite-version = "3.43.2.1" mysql-version = "8.1.0" rerunner-jupiter-version = "2.1.6" flyway-version = "9.22.3" -selenide-version = "6.19.0" +selenide-version = "6.19.1" lombok-version = "1.18.30" jacocoVersion = "0.8.10" @@ -32,7 +32,7 @@ shadow-version = "8.1.1" names-version = "0.49.0" jib-version = "3.4.0" git-properties-version = "2.4.1" -springboot-version = "3.1.4" +springboot-version = "3.1.5" springboot-dependencies-version = "1.1.3" test-logger-version = "4.0.0" git-version-plugin-version = "3.0.0" diff --git a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/twitch/data/MinuteWatchedProperties.java b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/twitch/data/MinuteWatchedProperties.java index 093cf0af..9de2ac25 100644 --- a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/twitch/data/MinuteWatchedProperties.java +++ b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/twitch/data/MinuteWatchedProperties.java @@ -15,18 +15,26 @@ @Builder @EqualsAndHashCode public class MinuteWatchedProperties{ - @JsonProperty("channel_id") - @NotNull - private String channelId; @JsonProperty("broadcast_id") @NotNull private String broadcastId; + @JsonProperty("channel") + @NotNull + private String channel; + @JsonProperty("channel_id") + @NotNull + private String channelId; + @JsonProperty("game") + @Nullable + private String game; + @JsonProperty("game_id") + @Nullable + private String gameId; + @JsonProperty("live") + private boolean live; @JsonProperty("player") @NotNull private String player; @JsonProperty("user_id") private int userId; - @JsonProperty("game") - @Nullable - private String game; } diff --git a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/ws/data/message/subtype/Summary.java b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/ws/data/message/subtype/Summary.java index 59a82b87..11cdd795 100644 --- a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/ws/data/message/subtype/Summary.java +++ b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/api/ws/data/message/subtype/Summary.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import fr.rakambda.channelpointsminer.miner.util.json.ISO8601ZonedDateTimeDeserializer; +import fr.rakambda.channelpointsminer.miner.util.json.UnknownDeserializer; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -29,4 +30,8 @@ public class Summary{ @JsonDeserialize(using = ISO8601ZonedDateTimeDeserializer.class) @Nullable private ZonedDateTime lastSeen; + @JsonProperty("count_by_md") + @Nullable + @JsonDeserialize(using = UnknownDeserializer.class) + private Object countByMd; } diff --git a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/miner/Miner.java b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/miner/Miner.java index 3053ef07..6bc3a8c3 100644 --- a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/miner/Miner.java +++ b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/miner/Miner.java @@ -140,9 +140,10 @@ public void start(){ scheduledExecutor.schedule(streamerConfigurationReload, 0, MINUTES); } - listenTopic(COMMUNITY_POINTS_USER_V1, getTwitchLogin().fetchUserId(gqlApi)); - listenTopic(USER_DROP_EVENTS, getTwitchLogin().fetchUserId(gqlApi)); - listenTopic(ONSITE_NOTIFICATIONS, getTwitchLogin().fetchUserId(gqlApi)); + var connectedUserId = getTwitchLogin().fetchUserId(gqlApi); + listenTopic(COMMUNITY_POINTS_USER_V1, connectedUserId); + listenTopic(USER_DROP_EVENTS, connectedUserId); + listenTopic(ONSITE_NOTIFICATIONS, connectedUserId); } } diff --git a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatched.java b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatched.java index 39310bbe..2c85803d 100644 --- a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatched.java +++ b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatched.java @@ -76,10 +76,13 @@ private boolean send(Streamer streamer){ var request = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(streamer.getId()) + .channel(streamer.getUsername()) .broadcastId(streamId.get()) .player(SITE_PLAYER) .userId(miner.getTwitchLogin().getUserIdAsInt(miner.getGqlApi())) + .gameId(streamer.getGame().map(Game::getId).orElse(null)) .game(streamer.getGame().map(Game::getName).orElse(null)) + .live(true) .build()) .build(); diff --git a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/util/json/UnknownDeserializer.java b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/util/json/UnknownDeserializer.java index 46e5be2f..2cac4ef3 100644 --- a/miner/src/main/java/fr/rakambda/channelpointsminer/miner/util/json/UnknownDeserializer.java +++ b/miner/src/main/java/fr/rakambda/channelpointsminer/miner/util/json/UnknownDeserializer.java @@ -24,7 +24,7 @@ public String deserialize(@NotNull JsonParser jsonParser, @NotNull Deserializati var currentLocation = jsonParser.getCurrentLocation(); var treeNode = jsonParser.readValueAsTree(); var treeNodeStr = treeNode == null ? null : treeNode.toString(); - log.warn("Got actual value for field {} (l:{},c:{}) : {}", jsonParser.getCurrentName(), currentLocation.getLineNr(), currentLocation.getColumnNr(), treeNodeStr); + log.warn("Got actual value for unknown field {} (l:{},c:{}) : {}", jsonParser.getCurrentName(), currentLocation.getLineNr(), currentLocation.getColumnNr(), treeNodeStr); return treeNodeStr; } } diff --git a/miner/src/test/java/fr/rakambda/channelpointsminer/miner/api/twitch/TwitchApiTest.java b/miner/src/test/java/fr/rakambda/channelpointsminer/miner/api/twitch/TwitchApiTest.java index 5ca768ba..8e13dabd 100644 --- a/miner/src/test/java/fr/rakambda/channelpointsminer/miner/api/twitch/TwitchApiTest.java +++ b/miner/src/test/java/fr/rakambda/channelpointsminer/miner/api/twitch/TwitchApiTest.java @@ -31,8 +31,10 @@ class TwitchApiTest{ private static final int USER_ID = 123456789; private static final String BROADCAST_ID = "broadcast-id"; private static final String CHANNEL_ID = "channel-id"; + private static final String CHANNEL_NAME = "channel-name"; private static final String PLAYER = "player"; private static final String GAME = "game"; + private static final String GAME_ID = "game-id"; private static final String STREAMER_URL = "https://google.com/streamer"; private static final String CONFIG_URL = "https://static.twitchcdn.net/config/settings.sq5d4q6s54ds854c84qs.js"; private static final String CONFIG_BODY = "".formatted(CONFIG_URL); @@ -56,8 +58,8 @@ void setUp(UnirestMock unirestMock) throws MalformedURLException{ @Test void sendMinutesWatched(UnirestMock unirest){ - var json = "[{\"event\":\"minute-watched\",\"properties\":{\"broadcast_id\":\"%s\",\"channel_id\":\"%s\",\"player\":\"%s\",\"user_id\":%d}}]" - .formatted(BROADCAST_ID, CHANNEL_ID, PLAYER, USER_ID); + var json = "[{\"event\":\"minute-watched\",\"properties\":{\"broadcast_id\":\"%s\",\"channel\":\"%s\",\"channel_id\":\"%s\",\"live\":true,\"player\":\"%s\",\"user_id\":%d}}]" + .formatted(BROADCAST_ID, CHANNEL_NAME, CHANNEL_ID, PLAYER, USER_ID); var expectedData = new String(Base64.getEncoder().encode(json.getBytes(UTF_8))); unirest.expect(POST, SPADE_URL) @@ -70,7 +72,9 @@ void sendMinutesWatched(UnirestMock unirest){ .userId(USER_ID) .broadcastId(BROADCAST_ID) .channelId(CHANNEL_ID) + .channel(CHANNEL_NAME) .player(PLAYER) + .live(true) .build()) .build(); assertThat(tested.sendPlayerEvents(spadeUrl, request)).isTrue(); @@ -80,8 +84,8 @@ void sendMinutesWatched(UnirestMock unirest){ @Test void sendMinutesWatchedWithGame(UnirestMock unirest){ - var json = "[{\"event\":\"minute-watched\",\"properties\":{\"broadcast_id\":\"%s\",\"channel_id\":\"%s\",\"game\":\"%s\",\"player\":\"%s\",\"user_id\":%d}}]" - .formatted(BROADCAST_ID, CHANNEL_ID, GAME, PLAYER, USER_ID); + var json = "[{\"event\":\"minute-watched\",\"properties\":{\"broadcast_id\":\"%s\",\"channel\":\"%s\",\"channel_id\":\"%s\",\"game\":\"%s\",\"game_id\":\"%s\",\"live\":true,\"player\":\"%s\",\"user_id\":%d}}]" + .formatted(BROADCAST_ID, CHANNEL_NAME, CHANNEL_ID, GAME, GAME_ID, PLAYER, USER_ID); var expectedData = new String(Base64.getEncoder().encode(json.getBytes(UTF_8))); unirest.expect(POST, SPADE_URL) @@ -93,9 +97,12 @@ void sendMinutesWatchedWithGame(UnirestMock unirest){ .properties(MinuteWatchedProperties.builder() .userId(USER_ID) .broadcastId(BROADCAST_ID) - .channelId(CHANNEL_ID) - .player(PLAYER) + .channelId(CHANNEL_ID) + .channel(CHANNEL_NAME) + .player(PLAYER) .game(GAME) + .gameId(GAME_ID) + .live(true) .build()) .build(); assertThat(tested.sendPlayerEvents(spadeUrl, request)).isTrue(); @@ -105,8 +112,8 @@ void sendMinutesWatchedWithGame(UnirestMock unirest){ @Test void sendMinutesWatchedNotSuccess(UnirestMock unirest){ - var json = "[{\"event\":\"minute-watched\",\"properties\":{\"broadcast_id\":\"%s\",\"channel_id\":\"%s\",\"player\":\"%s\",\"user_id\":%d}}]" - .formatted(BROADCAST_ID, CHANNEL_ID, PLAYER, USER_ID); + var json = "[{\"event\":\"minute-watched\",\"properties\":{\"broadcast_id\":\"%s\",\"channel\":\"%s\",\"channel_id\":\"%s\",\"live\":true,\"player\":\"%s\",\"user_id\":%d}}]" + .formatted(BROADCAST_ID, CHANNEL_NAME, CHANNEL_ID, PLAYER, USER_ID); var expectedData = new String(Base64.getEncoder().encode(json.getBytes(UTF_8))); unirest.expect(POST, SPADE_URL) @@ -119,7 +126,9 @@ void sendMinutesWatchedNotSuccess(UnirestMock unirest){ .userId(USER_ID) .broadcastId(BROADCAST_ID) .channelId(CHANNEL_ID) + .channel(CHANNEL_NAME) .player(PLAYER) + .live(true) .build()) .build(); assertThat(tested.sendPlayerEvents(spadeUrl, request)).isFalse(); @@ -139,7 +148,9 @@ void sendMinutesWatchedJsonError(){ .userId(USER_ID) .broadcastId(BROADCAST_ID) .channelId(CHANNEL_ID) + .channel(CHANNEL_NAME) .player(PLAYER) + .live(true) .build()) .build(); assertThat(tested.sendPlayerEvents(spadeUrl, request)).isFalse(); diff --git a/miner/src/test/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatchedTest.java b/miner/src/test/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatchedTest.java index dc6906ea..11e8c42e 100644 --- a/miner/src/test/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatchedTest.java +++ b/miner/src/test/java/fr/rakambda/channelpointsminer/miner/runnable/SendMinutesWatchedTest.java @@ -38,10 +38,12 @@ @ExtendWith(MockitoExtension.class) class SendMinutesWatchedTest{ private static final String STREAMER_ID = "streamer-id"; + private static final String STREAMER_NAME = "streamer-name"; private static final String STREAM_ID = "stream-id"; private static final String SITE_PLAYER = "site"; private static final int USER_ID = 123456789; private static final String GAME_NAME = "game-name"; + private static final String GAME_ID = "game-id"; private static final Instant NOW = Instant.parse("2021-03-25T18:12:36Z"); private static final int INDEX = 5; @@ -75,24 +77,30 @@ void setUp() throws MalformedURLException{ lenient().when(twitchLogin.getUserIdAsInt(gqlApi)).thenReturn(USER_ID); lenient().when(streamer.getId()).thenReturn(STREAMER_ID); + lenient().when(streamer.getUsername()).thenReturn(STREAMER_NAME); lenient().when(streamer.getSpadeUrl()).thenReturn(spadeUrl); lenient().when(streamer.getStreamId()).thenReturn(Optional.of(STREAM_ID)); lenient().when(streamer.isStreaming()).thenReturn(true); lenient().when(streamer.getIndex()).thenReturn(INDEX); + + lenient().when(game.getName()).thenReturn(GAME_NAME); + lenient().when(game.getId()).thenReturn(GAME_ID); } @Test void sendingMinutesWatched(){ when(streamer.getGame()).thenReturn(Optional.of(game)); - when(game.getName()).thenReturn(GAME_NAME); var expected = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(STREAMER_ID) + .channel(STREAMER_NAME) .broadcastId(STREAM_ID) .player(SITE_PLAYER) .userId(USER_ID) + .gameId(GAME_ID) .game(GAME_NAME) + .live(true) .build()) .build(); @@ -109,15 +117,17 @@ void sendingMinutesWatchedUpdatesMinutesWatched(){ timeFactory.when(TimeFactory::now).thenReturn(NOW); when(streamer.getGame()).thenReturn(Optional.of(game)); - when(game.getName()).thenReturn(GAME_NAME); var expected = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(STREAMER_ID) + .channel(STREAMER_NAME) .broadcastId(STREAM_ID) .player(SITE_PLAYER) .userId(USER_ID) .game(GAME_NAME) + .gameId(GAME_ID) + .live(true) .build()) .build(); @@ -139,15 +149,17 @@ void sendingMinutesWatchedUpdatesMinutesWatchedResetIfNotPresentOnARound(){ timeFactory.when(TimeFactory::now).thenReturn(NOW); when(streamer.getGame()).thenReturn(Optional.of(game)); - when(game.getName()).thenReturn(GAME_NAME); var expected = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(STREAMER_ID) + .channel(STREAMER_NAME) .broadcastId(STREAM_ID) .player(SITE_PLAYER) .userId(USER_ID) .game(GAME_NAME) + .gameId(GAME_ID) + .live(true) .build()) .build(); @@ -187,15 +199,17 @@ void sendingMinutesWatchedDoesNotUpdateMinutesWatchedIfCallFailed(){ timeFactory.when(TimeFactory::now).thenReturn(NOW); when(streamer.getGame()).thenReturn(Optional.of(game)); - when(game.getName()).thenReturn(GAME_NAME); var expected = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(STREAMER_ID) + .channel(STREAMER_NAME) .broadcastId(STREAM_ID) .player(SITE_PLAYER) .userId(USER_ID) .game(GAME_NAME) + .gameId(GAME_ID) + .live(true) .build()) .build(); @@ -216,13 +230,17 @@ void sendingMinutesWatchedDoesNotUpdateMinutesWatchedIfCallFailed(){ @Test void sendingMinutesWatchedNoGameName(){ when(streamer.getGame()).thenReturn(Optional.of(game)); + when(game.getName()).thenReturn(null); + when(game.getId()).thenReturn(null); var expected = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(STREAMER_ID) + .channel(STREAMER_NAME) .broadcastId(STREAM_ID) .player(SITE_PLAYER) .userId(USER_ID) + .live(true) .build()) .build(); @@ -238,9 +256,11 @@ void sendingMinutesWatchedNoGame(){ var expected = MinuteWatchedEvent.builder() .properties(MinuteWatchedProperties.builder() .channelId(STREAMER_ID) + .channel(STREAMER_NAME) .broadcastId(STREAM_ID) .player(SITE_PLAYER) .userId(USER_ID) + .live(true) .build()) .build(); @@ -293,11 +313,11 @@ void sendingMinutesWatchedChatBanned(){ @Test void sendingMinutesWatchedSeveralStreamers() throws MalformedURLException{ - var streamerId2 = "streamer-id-2"; var spadeUrl2 = new URL("https://google.com/2"); var streamer2 = mock(Streamer.class); - when(streamer2.getId()).thenReturn(streamerId2); + when(streamer2.getId()).thenReturn("s2"); + when(streamer2.getUsername()).thenReturn("sn2"); when(streamer2.getSpadeUrl()).thenReturn(spadeUrl2); when(streamer2.getStreamId()).thenReturn(Optional.of(STREAM_ID)); when(streamer2.isStreaming()).thenReturn(true); @@ -341,6 +361,7 @@ void sendingMinutesWatchedBestScores() throws MalformedURLException{ var spade2 = new URL("https://spade2"); var s2 = mock(Streamer.class); when(s2.getId()).thenReturn("s2"); + when(s2.getUsername()).thenReturn("sn2"); when(s2.getSpadeUrl()).thenReturn(spade2); when(s2.getStreamId()).thenReturn(Optional.of("sid2")); when(s2.isStreaming()).thenReturn(true); @@ -354,6 +375,7 @@ void sendingMinutesWatchedBestScores() throws MalformedURLException{ var spade4 = new URL("https://spade4"); var s4 = mock(Streamer.class); when(s4.getId()).thenReturn("s4"); + when(s4.getUsername()).thenReturn("sn4"); when(s4.getSpadeUrl()).thenReturn(spade4); when(s4.getStreamId()).thenReturn(Optional.of("sid4")); when(s4.isStreaming()).thenReturn(true); @@ -379,6 +401,7 @@ void sendingMinutesWatchedBestScoresEqualsPicksIndex() throws MalformedURLExcept var spade2 = new URL("https://spade2"); var s2 = mock(Streamer.class); when(s2.getId()).thenReturn("s2"); + when(s2.getUsername()).thenReturn("sn2"); when(s2.getSpadeUrl()).thenReturn(spade2); when(s2.getStreamId()).thenReturn(Optional.of("sid2")); when(s2.isStreaming()).thenReturn(true); @@ -394,6 +417,7 @@ void sendingMinutesWatchedBestScoresEqualsPicksIndex() throws MalformedURLExcept var spade4 = new URL("https://spade4"); var s4 = mock(Streamer.class); when(s4.getId()).thenReturn("s4"); + when(s4.getUsername()).thenReturn("sn4"); when(s4.getSpadeUrl()).thenReturn(spade4); when(s4.getStreamId()).thenReturn(Optional.of("sid4")); when(s4.isStreaming()).thenReturn(true);