Skip to content

Commit aa56f8e

Browse files
committed
-- tests improvement
1 parent e40bde8 commit aa56f8e

File tree

8 files changed

+165
-114
lines changed

8 files changed

+165
-114
lines changed

API/src/main/java/io/github/jwdeveloper/tiktok/annotations/TikTokEventObserver.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,16 @@
2626
import java.lang.annotation.RetentionPolicy;
2727

2828
@Retention(RetentionPolicy.RUNTIME)
29-
public @interface TikTokEventObserver {
30-
29+
public @interface TikTokEventObserver
30+
{
3131
/**
32-
* When more than one method listen for certain Even, you can specify the method priority
33-
* @return
32+
* When more than one method listen for certain Event, you can specify the method priority
33+
* @see Priority
3434
*/
3535
Priority priority() default Priority.NORMAL;
3636

3737
/**
38-
* When true, action is invoked on the another thread
39-
* @return
38+
* When true, action is invoked on a thread, from the threads pool
4039
*/
4140
boolean async() default false;
4241
}

API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,29 +32,34 @@
3232

3333
public interface LiveClientBuilder extends EventsBuilder<LiveClientBuilder> {
3434

35+
3536
/**
3637
* This method is triggered after default mappings are registered
3738
* It could be used to OVERRIDE behaviour of mappings and implement custom behaviour
38-
*
39+
* <p>
3940
* Be aware if for example you override WebcastGiftEvent, onGiftEvent() will not be working
4041
*
4142
* @param onCustomMappings lambda method
4243
* @return
4344
*/
4445
LiveClientBuilder mappings(Consumer<LiveMapper> onCustomMappings);
4546

47+
@Deprecated(forRemoval = true, since = "1.8.2 use `mappings` method instead")
48+
LiveClientBuilder onMappings(Consumer<LiveMapper> onCustomMappings);
4649

4750
/**
4851
* Configuration of client settings
49-
* @see LiveClientSettings
52+
*
5053
* @param onConfigure
5154
* @return
55+
* @see LiveClientSettings
5256
*/
5357
LiveClientBuilder configure(Consumer<LiveClientSettings> onConfigure);
5458

5559
/**
5660
* Adding events listener class, its fancy way to register events without using lamda method
5761
* but actual method in class that implements TikTokEventListener
62+
*
5863
* @return
5964
*/
6065
LiveClientBuilder addListener(Object listener);
@@ -64,26 +69,26 @@ public interface LiveClientBuilder extends EventsBuilder<LiveClientBuilder> {
6469
* Allows you to use own implementation of internal TikTokLive dependencies,
6570
* when the default implementation does not meet your needs
6671
*
67-
*
6872
* @param onCustomizeDependencies access to dependency container
6973
* @return
7074
*/
7175
LiveClientBuilder customize(Consumer<DependanceContainerBuilder> onCustomizeDependencies);
7276

7377
/**
7478
* Builds new instance of the LiveClient
79+
*
7580
* @return LiveClient object
7681
*/
7782
LiveClient build();
7883

7984
/**
8085
* Builds new instance of the LiveClient and connects to live
86+
*
8187
* @return LiveClient object
8288
*/
8389
LiveClient buildAndConnect();
8490

8591
/**
86-
*
8792
* @return LiveClient object and connects to TikTok live asynchronously
8893
*/
8994
CompletableFuture<LiveClient> buildAndConnectAsync();

Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,6 @@ public TikTokLiveClient(
7878
this.logger = logger;
7979
}
8080

81-
public void connectAsync(Consumer<LiveClient> onConnection) {
82-
connectAsync().thenAccept(onConnection);
83-
}
84-
85-
public CompletableFuture<LiveClient> connectAsync() {
86-
return CompletableFuture.supplyAsync(() -> {
87-
connect();
88-
return this;
89-
});
90-
}
91-
9281
public void connect() {
9382
try {
9483
tryConnect();
@@ -199,4 +188,15 @@ public void publishMessage(String webcastMessageName, byte[] payload) {
199188
messageHandler.handleSingleMessage(this, message);
200189
}
201190

191+
192+
public void connectAsync(Consumer<LiveClient> onConnection) {
193+
connectAsync().thenAccept(onConnection);
194+
}
195+
196+
public CompletableFuture<LiveClient> connectAsync() {
197+
return CompletableFuture.supplyAsync(() -> {
198+
connect();
199+
return this;
200+
});
201+
}
202202
}

Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ public LiveClientBuilder mappings(Consumer<LiveMapper> consumer) {
7070
return this;
7171
}
7272

73+
@Override
74+
public LiveClientBuilder onMappings(Consumer<LiveMapper> onCustomMappings) {
75+
mappings(onCustomMappings);
76+
return this;
77+
}
78+
7379
public TikTokLiveClientBuilder configure(Consumer<LiveClientSettings> onConfigure) {
7480
onConfigure.accept(clientSettings);
7581
return this;

Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import io.github.jwdeveloper.dependance.api.DependanceContainer;
2727
import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver;
28+
import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent;
2829
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
2930
import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException;
3031
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
@@ -40,14 +41,14 @@
4041
public class TikTokListenersManager implements ListenersManager {
4142

4243
private final Map<Object, List<ListenerMethodInfo>> listeners;
43-
private final LiveEventsHandler eventObserver;
44+
private final LiveEventsHandler eventsHandler;
4445
private final ExecutorService executorService;
4546
private final DependanceContainer dependanceContainer;
4647

4748

4849
public TikTokListenersManager(LiveEventsHandler tikTokEventHandler,
4950
DependanceContainer dependanceContainer) {
50-
this.eventObserver = tikTokEventHandler;
51+
this.eventsHandler = tikTokEventHandler;
5152
this.dependanceContainer = dependanceContainer;
5253
this.listeners = new HashMap<>();
5354
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
@@ -66,7 +67,7 @@ public void addListener(Object listener) {
6667

6768
var methodsInfo = getMethodsInfo(listener);
6869
for (var methodInfo : methodsInfo) {
69-
eventObserver.subscribe(methodInfo.getEventType(), methodInfo.getAction());
70+
eventsHandler.subscribe(methodInfo.getEventType(), methodInfo.getAction());
7071
}
7172
listeners.put(listener, methodsInfo);
7273
}
@@ -78,7 +79,7 @@ public void removeListener(Object listener) {
7879
}
7980
var methodsInfo = listeners.get(listener);
8081
for (var methodInfo : methodsInfo) {
81-
eventObserver.unsubscribe(methodInfo.getEventType(), methodInfo.getAction());
82+
eventsHandler.unsubscribe(methodInfo.getEventType(), methodInfo.getAction());
8283
}
8384
listeners.remove(listener);
8485
}
@@ -149,7 +150,7 @@ private EventConsumer createAction(Object listener, Method method, Class tiktokE
149150
var parameters = methodContainer.resolveParameters(method);
150151
method.invoke(listener, parameters);
151152
} catch (Exception e) {
152-
throw new TikTokEventListenerMethodException(e);
153+
eventsHandler.publish(liveClient, new TikTokErrorEvent(new TikTokEventListenerMethodException(e)));
153154
}
154155
};
155156
}
Lines changed: 29 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,51 @@
11
package io.github.jwdeveloper.tiktok;
22

3-
import io.github.jwdeveloper.tiktok.data.requests.LiveData;
4-
import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings;
3+
import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilder;
4+
import io.github.jwdeveloper.tiktok.data.events.TikTokConnectedEvent;
5+
import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent;
6+
import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent;
7+
import io.github.jwdeveloper.tiktok.data.events.control.TikTokConnectingEvent;
8+
import io.github.jwdeveloper.tiktok.data.events.control.TikTokPreConnectionEvent;
9+
import io.github.jwdeveloper.tiktok.data.events.http.TikTokRoomDataResponseEvent;
10+
import io.github.jwdeveloper.tiktok.data.events.room.TikTokRoomInfoEvent;
511
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
6-
import io.github.jwdeveloper.tiktok.http.LiveHttpClient;
7-
import io.github.jwdeveloper.tiktok.listener.ListenersManager;
8-
import io.github.jwdeveloper.tiktok.live.GiftsManager;
9-
import io.github.jwdeveloper.tiktok.live.LiveClient;
10-
import io.github.jwdeveloper.tiktok.live.LiveEventsHandler;
11-
import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler;
12+
import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder;
1213
import io.github.jwdeveloper.tiktok.models.ConnectionState;
13-
import io.github.jwdeveloper.tiktok.websocket.LiveSocketClient;
1414
import org.junit.Assert;
15-
import org.junit.Before;
1615
import org.junit.Test;
17-
import org.mockito.Mockito;
1816

19-
import java.util.logging.Logger;
17+
public class TikTokLiveClientTests extends TikTokTestBase {
2018

21-
public class TikTokLiveClientTests {
19+
@Override
20+
public void onBeforeEachTest(LiveClientBuilder liveClientBuilder,
21+
DependanceContainerBuilder containerBuilder) {
2222

23-
private LiveClient sut;
24-
LiveMessagesHandler messageHandler;
25-
GiftsManager giftsManager;
26-
TikTokRoomInfo tikTokLiveMeta;
27-
LiveHttpClient tiktokHttpClient;
28-
LiveSocketClient webSocketClient;
29-
LiveEventsHandler tikTokEventHandler;
30-
LiveClientSettings clientSettings;
31-
ListenersManager listenersManager;
32-
Logger logger;
33-
34-
@Before
35-
public void onBefore() {
36-
messageHandler = Mockito.mock(LiveMessagesHandler.class);
37-
giftsManager = Mockito.mock(GiftsManager.class);
38-
tikTokLiveMeta = Mockito.mock(TikTokRoomInfo.class);
39-
tiktokHttpClient = Mockito.mock(LiveHttpClient.class);
40-
webSocketClient = Mockito.mock(LiveSocketClient.class);
41-
tikTokEventHandler = Mockito.mock(LiveEventsHandler.class);
42-
clientSettings = Mockito.mock(LiveClientSettings.class);
43-
listenersManager = Mockito.mock(ListenersManager.class);
44-
logger = Mockito.mock(Logger.class);
45-
46-
sut = new TikTokLiveClient(messageHandler,
47-
giftsManager,
48-
tikTokLiveMeta,
49-
tiktokHttpClient,
50-
webSocketClient,
51-
tikTokEventHandler,
52-
clientSettings,
53-
listenersManager,
54-
logger);
23+
liveClientBuilder.onMappings()
5524
}
5625

57-
5826
@Test
5927
public void shouldThrownWhenAlreadyConnected() {
60-
tikTokLiveMeta.setConnectionState(ConnectionState.CONNECTED);
61-
Assert.assertThrows(TikTokLiveException.class, () ->
62-
{
63-
sut.connect();
64-
});
65-
}
66-
67-
@Test
68-
public void shouldThrowWhenUserIsOffline() {
69-
70-
var request = new LiveData.Request("X");
71-
var response = new LiveData.Response();
72-
response.setLiveStatus(LiveData.LiveStatus.HostOffline);
73-
Mockito.when(tiktokHttpClient.fetchLiveData(request)).thenReturn(response);
74-
Assert.assertThrows(TikTokLiveException.class, () ->
75-
{
76-
sut.connect();
77-
});
78-
}
79-
80-
@Test
81-
public void shouldThrowWhenUserNotFound()
82-
{
83-
var request = new LiveData.Request("X");
84-
var response = new LiveData.Response();
85-
response.setLiveStatus(LiveData.LiveStatus.HostNotFound);
86-
Mockito.when(tiktokHttpClient.fetchLiveData(request)).thenReturn(response);
87-
Assert.assertThrows(TikTokLiveException.class, () ->
88-
{
89-
sut.connect();
90-
});
91-
}
92-
93-
@Test
94-
public void shouldThrowWhenAgeRestricted()
95-
{
96-
Mockito.when(tiktokHttpClient.fetchLiveData(new LiveData.Request("X")))
97-
.thenReturn(new LiveData.Response());
28+
roomInfoMock().setConnectionState(ConnectionState.CONNECTED);
9829
Assert.assertThrows(TikTokLiveException.class, () ->
9930
{
100-
sut.connect();
31+
liveClient().connect();
10132
});
33+
Assert.assertEquals(ConnectionState.DISCONNECTED, roomInfoMock().getConnectionState());
34+
AssertEvents(
35+
TikTokErrorEvent.class,
36+
TikTokDisconnectedEvent.class
37+
);
10238
}
10339

104-
10540
@Test
10641
public void shouldConnect() {
107-
// sut.connect();
42+
liveClient().connect();
43+
Assert.assertEquals(ConnectionState.CONNECTED, roomInfoMock().getConnectionState());
44+
AssertEvents(
45+
TikTokConnectingEvent.class,
46+
TikTokRoomDataResponseEvent.class,
47+
TikTokPreConnectionEvent.class,
48+
TikTokConnectedEvent.class,
49+
TikTokRoomInfoEvent.class);
10850
}
109-
11051
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.github.jwdeveloper.tiktok;
2+
3+
import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilder;
4+
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
5+
import io.github.jwdeveloper.tiktok.live.LiveClient;
6+
import io.github.jwdeveloper.tiktok.live.LiveEventsHandler;
7+
import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder;
8+
import io.github.jwdeveloper.tiktok.mocks.EventsHandlerMock;
9+
import lombok.Getter;
10+
import lombok.experimental.Accessors;
11+
import org.junit.Before;
12+
13+
/**
14+
* Base class for the unit tests
15+
*/
16+
17+
@Getter
18+
@Accessors(fluent = true)
19+
public abstract class TikTokTestBase {
20+
21+
private LiveClient liveClient;
22+
23+
private EventsHandlerMock eventsHandlerMock;
24+
25+
private TikTokRoomInfo roomInfoMock;
26+
27+
public void AssertEvents(Class<? extends TikTokEvent>... events) {
28+
eventsHandlerMock.assertEvents(events);
29+
}
30+
31+
@Before
32+
public void setup() {
33+
34+
var builder = TikTokLive.newClient("test");
35+
eventsHandlerMock = new EventsHandlerMock();
36+
roomInfoMock = new TikTokRoomInfo();
37+
roomInfoMock.setHostName("test");
38+
liveClient = builder
39+
.configure(liveClientSettings ->
40+
{
41+
liveClientSettings.setOffline(true);
42+
liveClientSettings.setFetchGifts(false);
43+
})
44+
.customize(containerBuilder ->
45+
{
46+
containerBuilder.registerSingleton(LiveEventsHandler.class, eventsHandlerMock);
47+
containerBuilder.registerSingleton(TikTokRoomInfo.class, roomInfoMock);
48+
onBeforeEachTest(builder, containerBuilder);
49+
}).build();
50+
}
51+
52+
public abstract void onBeforeEachTest(LiveClientBuilder liveClientBuilder, DependanceContainerBuilder containerBuilder);
53+
}

0 commit comments

Comments
 (0)