Skip to content

Commit 0ccfe86

Browse files
implement events (both entity update callbacks and chat events)
1 parent 5fd0f98 commit 0ccfe86

File tree

15 files changed

+467
-277
lines changed

15 files changed

+467
-277
lines changed

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/MessageDraftTests.cs

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,26 @@ public class MessageDraftTests
1111
private Chat chat;
1212
private Channel channel;
1313
private User dummyUser;
14-
private Channel dummyChannel;
1514

1615
[SetUp]
1716
public async Task Setup()
1817
{
19-
chat = await Chat.CreateInstance(new PubnubChatConfig(storeUserActivityTimestamp: true), new PNConfiguration(new UserId("message_draft_tests_user"))
18+
chat = TestUtils.AssertOperation(await Chat.CreateInstance(new PubnubChatConfig(storeUserActivityTimestamp: true), new PNConfiguration(new UserId("message_draft_tests_user"))
2019
{
2120
PublishKey = PubnubTestsParameters.PublishKey,
2221
SubscribeKey = PubnubTestsParameters.SubscribeKey
23-
});
24-
channel = await chat.CreatePublicConversation("message_draft_tests_channel", new ChatChannelData()
22+
}));
23+
channel = TestUtils.AssertOperation(await chat.CreatePublicConversation("message_draft_tests_channel", new ChatChannelData()
2524
{
2625
ChannelName = "MessageDraftTestingChannel"
27-
});
28-
if (!chat.TryGetCurrentUser(out var user))
29-
{
30-
Assert.Fail();
31-
}
32-
26+
}));
3327
channel.Join();
3428
await Task.Delay(3000);
35-
36-
if (!chat.TryGetUser("mock_user", out dummyUser))
37-
{
38-
dummyUser = await chat.CreateUser("mock_user", new ChatUserData()
39-
{
40-
Username = "Mock Usernamiski"
41-
});
42-
}
4329

44-
if (!chat.TryGetChannel("dummy_channel", out dummyChannel))
30+
dummyUser = await chat.GetOrCreateUser("mock_user", new ChatUserData()
4531
{
46-
dummyChannel = await chat.CreatePublicConversation("dummy_channel");
47-
}
32+
Username = "Mock Usernamiski"
33+
});
4834
}
4935

5036
[Test]

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/RestrictionsTests.cs

Lines changed: 13 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,11 @@ public class RestrictionsTests
1212
[SetUp]
1313
public async Task Setup()
1414
{
15-
var createChat = await Chat.CreateInstance(new PubnubChatConfig(storeUserActivityTimestamp: true), new PNConfiguration(new UserId("restrictions_tests_user"))
15+
chat = TestUtils.AssertOperation(await Chat.CreateInstance(new PubnubChatConfig(storeUserActivityTimestamp: true), new PNConfiguration(new UserId("restrictions_tests_user"))
1616
{
1717
PublishKey = PubnubTestsParameters.PublishKey,
1818
SubscribeKey = PubnubTestsParameters.SubscribeKey
19-
});
20-
if (createChat.Error)
21-
{
22-
Assert.Fail($"Failed to create chat! Error: {createChat.Exception.Message}");
23-
}
24-
chat = createChat.Result;
19+
}));
2520
}
2621

2722
[TearDown]
@@ -35,12 +30,7 @@ public async Task CleanUp()
3530
public async Task TestSetRestrictions()
3631
{
3732
var user = await chat.GetOrCreateUser("user123");
38-
var createChannel = await chat.CreatePublicConversation("new_channel");
39-
if (createChannel.Error)
40-
{
41-
Assert.Fail($"Failed to create channel, error: {createChannel.Exception.Message}");
42-
}
43-
var channel = createChannel.Result;
33+
var channel = TestUtils.AssertOperation(await chat.CreatePublicConversation("new_channel"));
4434

4535
await Task.Delay(2000);
4636

@@ -50,30 +40,16 @@ public async Task TestSetRestrictions()
5040
Mute = true,
5141
Reason = "Some Reason"
5242
};
53-
var setRestrictions = await channel.SetRestrictions(user.Id, restriction);
54-
if (setRestrictions.Error)
55-
{
56-
Assert.Fail($"Failed to set restrictions, error: {setRestrictions.Exception.Message}");
57-
}
43+
TestUtils.AssertOperation(await channel.SetRestrictions(user.Id, restriction));
5844

5945
await Task.Delay(3000);
60-
61-
var getUser = await channel.GetUserRestrictions(user);
62-
if (getUser.Error)
63-
{
64-
Assert.Fail($"Failed to fetch User restrictions. Exception: {getUser.Exception}");
65-
}
66-
var fetchedRestriction = getUser.Result;
46+
47+
var fetchedRestriction = TestUtils.AssertOperation(await channel.GetUserRestrictions(user));
6748

6849
Assert.True(restriction.Ban == fetchedRestriction.Ban && restriction.Mute == fetchedRestriction.Mute &&
6950
restriction.Reason == fetchedRestriction.Reason);
7051

71-
var getChannel = await user.GetChannelRestrictions(channel);
72-
if (getChannel.Error)
73-
{
74-
Assert.Fail($"Failed to fetch Channel restrictions. Exception: {getChannel.Exception}");
75-
}
76-
var restrictionFromUser = getChannel.Result;
52+
var restrictionFromUser = TestUtils.AssertOperation(await user.GetChannelRestrictions(channel));
7753

7854
Assert.True(restriction.Ban == restrictionFromUser.Ban && restriction.Mute == restrictionFromUser.Mute &&
7955
restriction.Reason == restrictionFromUser.Reason);
@@ -83,12 +59,7 @@ public async Task TestSetRestrictions()
8359
public async Task TestGetRestrictionsSets()
8460
{
8561
var user = await chat.GetOrCreateUser("user1234");
86-
var createChannel = await chat.CreatePublicConversation("new_channel");
87-
if (createChannel.Error)
88-
{
89-
Assert.Fail($"Failed to create channel, error: {createChannel.Exception.Message}");
90-
}
91-
var channel = createChannel.Result;
62+
var channel = TestUtils.AssertOperation(await chat.CreatePublicConversation("new_channel"));
9263

9364
await Task.Delay(4000);
9465

@@ -98,26 +69,14 @@ public async Task TestGetRestrictionsSets()
9869
Mute = true,
9970
Reason = "Some Reason"
10071
};
101-
var setRestrictions = await channel.SetRestrictions(user.Id, restriction);
102-
if (setRestrictions.Error)
103-
{
104-
Assert.Fail($"Failed to set restrictions, error: {setRestrictions.Exception.Message}");
105-
}
72+
TestUtils.AssertOperation(await channel.SetRestrictions(user.Id, restriction));
10673

10774
await Task.Delay(4000);
10875

109-
var a = await channel.GetUsersRestrictions();
110-
if (a.Error)
111-
{
112-
Assert.Fail($"Failed to fetch Users restrictions. Exception: {a.Exception}");
113-
}
114-
var b = await user.GetChannelsRestrictions();
115-
if (b.Error)
116-
{
117-
Assert.Fail($"Failed to fetch Channels restrictions. Exception: {b.Exception}");
118-
}
76+
var a = TestUtils.AssertOperation(await channel.GetUsersRestrictions());
77+
var b = TestUtils.AssertOperation(await user.GetChannelsRestrictions());
11978

120-
Assert.True(a.Result.Restrictions.Any(x => x.UserId == user.Id));
121-
Assert.True(b.Result.Restrictions.Any(x => x.ChannelId == channel.Id));
79+
Assert.True(a.Restrictions.Any(x => x.UserId == user.Id));
80+
Assert.True(b.Restrictions.Any(x => x.ChannelId == channel.Id));
12281
}
12382
}

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/TestUtils.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
using PubNubChatAPI.Entities;
2+
using PubnubChatApi.Entities.Data;
23

34
namespace PubNubChatApi.Tests;
45

56
public static class TestUtils
67
{
7-
public static async Task<User> GetOrCreateUser(this Chat chat, string userId)
8+
public static async Task<User> GetOrCreateUser(this Chat chat, string userId, ChatUserData? userData = null)
89
{
910
var getUser = await chat.GetUser(userId);
1011
if (getUser.Error)
1112
{
12-
var createUser = await chat.CreateUser(userId);
13+
userData ??= new ChatUserData();
14+
var createUser = await chat.CreateUser(userId, userData);
1315
if (createUser.Error)
1416
{
1517
Assert.Fail($"Failed to create User! Error: {createUser.Exception.Message}");
@@ -20,4 +22,20 @@ public static async Task<User> GetOrCreateUser(this Chat chat, string userId)
2022
}
2123
return getUser.Result;
2224
}
25+
26+
public static void AssertOperation(ChatOperationResult chatOperationResult)
27+
{
28+
if (chatOperationResult.Error)
29+
{
30+
Assert.Fail($"Chat operation failed! Error: {chatOperationResult.Exception.Message}");
31+
}
32+
}
33+
public static T AssertOperation<T>(ChatOperationResult<T> chatOperationResult)
34+
{
35+
if (chatOperationResult.Error)
36+
{
37+
Assert.Fail($"Chat operation for getting {typeof(T).Name} failed! Error: {chatOperationResult.Exception.Message}");
38+
}
39+
return chatOperationResult.Result;
40+
}
2341
}

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/UserTests.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System.Diagnostics;
21
using PubnubApi;
32
using PubNubChatAPI.Entities;
43
using PubnubChatApi.Entities.Data;
@@ -16,16 +15,13 @@ public class UserTests
1615
[SetUp]
1716
public async Task Setup()
1817
{
19-
chat = await Chat.CreateInstance(new PubnubChatConfig(storeUserActivityTimestamp: true), new PNConfiguration(new UserId("user_tests_user"))
18+
chat = TestUtils.AssertOperation(await Chat.CreateInstance(new PubnubChatConfig(storeUserActivityTimestamp: true), new PNConfiguration(new UserId("user_tests_user"))
2019
{
2120
PublishKey = PubnubTestsParameters.PublishKey,
2221
SubscribeKey = PubnubTestsParameters.SubscribeKey
23-
});
24-
channel = await chat.CreatePublicConversation("user_tests_channel");
25-
if (!chat.TryGetCurrentUser(out user))
26-
{
27-
Assert.Fail();
28-
}
22+
}));
23+
channel = TestUtils.AssertOperation(await chat.CreatePublicConversation("user_tests_channel"));
24+
user = TestUtils.AssertOperation(await chat.GetCurrentUser());
2925
channel.Join();
3026
await Task.Delay(3500);
3127
}
@@ -98,34 +94,38 @@ await testUser.Update(new ChatUserData()
9894
[Test]
9995
public async Task TestUserDelete()
10096
{
101-
var someUser = await chat.CreateUser(Guid.NewGuid().ToString());
102-
103-
Assert.True(chat.TryGetUser(someUser.Id, out _), "Couldn't get freshly created user");
97+
var someUser = TestUtils.AssertOperation(await chat.CreateUser(Guid.NewGuid().ToString()));
98+
99+
TestUtils.AssertOperation(await chat.GetUser(someUser.Id));
104100

105101
await someUser.DeleteUser();
106102

107103
await Task.Delay(3000);
108-
109-
Assert.False(chat.TryGetUser(someUser.Id, out _), "Got the freshly deleted user");
104+
105+
var getAfterUser = await chat.GetUser(someUser.Id);
106+
if (!getAfterUser.Error)
107+
{
108+
Assert.Fail("Got the freshly deleted user");
109+
}
110110
}
111111

112112
[Test]
113113
public async Task TestUserWherePresent()
114114
{
115-
var someChannel = await chat.CreatePublicConversation();
115+
var someChannel = TestUtils.AssertOperation(await chat.CreatePublicConversation());
116116
someChannel.Join();
117117

118118
await Task.Delay(4000);
119119

120-
var where = await user.WherePresent();
120+
var where = TestUtils.AssertOperation(await user.WherePresent());
121121

122122
Assert.Contains(someChannel.Id, where, "user.WherePresent() doesn't have most recently joined channel!");
123123
}
124124

125125
[Test]
126126
public async Task TestUserIsPresentOn()
127127
{
128-
var someChannel = await chat.CreatePublicConversation();
128+
var someChannel = TestUtils.AssertOperation(await chat.CreatePublicConversation());
129129
someChannel.Join();
130130

131131
await Task.Delay(4000);
Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,44 @@
1-
using System;
2-
using System.Diagnostics;
3-
using System.Runtime.InteropServices;
41
using System.Threading.Tasks;
52
using PubnubApi;
6-
using PubnubChatApi.Utilities;
73

84
namespace PubNubChatAPI.Entities
95
{
106
public abstract class ChatEntity
117
{
8+
protected Chat chat;
129
protected Subscription? updateSubscription;
10+
protected abstract string UpdateChannelId { get; }
11+
12+
internal ChatEntity(Chat chat)
13+
{
14+
this.chat = chat;
15+
}
16+
17+
protected void SetListening(Subscription subscription, bool listen, string channelId, SubscribeCallback listener)
18+
{
19+
if (listen)
20+
{
21+
if (subscription != null)
22+
{
23+
return;
24+
}
25+
subscription = chat.PubnubInstance.Channel(channelId).Subscription(SubscriptionOptions.ReceivePresenceEvents);
26+
subscription.AddListener(listener);
27+
subscription.Subscribe<object>();
28+
}
29+
else
30+
{
31+
subscription?.Unsubscribe<object>();
32+
}
33+
}
1334

1435
public virtual void SetListeningForUpdates(bool listen)
1536
{
16-
throw new NotImplementedException();
37+
SetListening(updateSubscription, listen, UpdateChannelId, CreateUpdateListener());
1738
}
1839

40+
protected abstract SubscribeCallback CreateUpdateListener();
41+
1942
public abstract Task Resync();
2043
}
2144
}

c-sharp-chat/PubnubChatApi/PubnubChatApi/Entities/Base/UniqueChatEntity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public abstract class UniqueChatEntity : ChatEntity
66
{
77
public string Id { get; protected set; }
88

9-
internal UniqueChatEntity(string uniqueId)
9+
internal UniqueChatEntity(Chat chat, string uniqueId) : base(chat)
1010
{
1111
Id = uniqueId;
1212
}

0 commit comments

Comments
 (0)