Merge pull request #902 from GetStream/feat/reaction_score

feat(llc): Exposed score as a param for sendReaction function in client & channel
This commit is contained in:
Ayush Shekhar
2022-02-16 19:47:34 +05:30
committed by GitHub
5 changed files with 250 additions and 23 deletions
+4 -1
View File
@@ -1,9 +1,12 @@
## Upcoming ## Upcoming
✅ Added
- You can now pass `score` to `client.sendReaction` and `channel.sendReaction` functions
🐞 Fixed 🐞 Fixed
- [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890). Fixed Reactions not updating on thread messages. Thanks [bstolinski](https://github.com/bstolinski). - [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890). Fixed Reactions not updating on thread messages. Thanks [bstolinski](https://github.com/bstolinski).
-
## 3.4.0 ## 3.4.0
🐞 Fixed 🐞 Fixed
@@ -811,6 +811,7 @@ class Channel {
Future<SendReactionResponse> sendReaction( Future<SendReactionResponse> sendReaction(
Message message, Message message,
String type, { String type, {
int score = 1,
Map<String, Object?> extraData = const {}, Map<String, Object?> extraData = const {},
bool enforceUnique = false, bool enforceUnique = false,
}) async { }) async {
@@ -829,7 +830,7 @@ class Channel {
createdAt: now, createdAt: now,
type: type, type: type,
user: user, user: user,
score: 1, score: score,
extraData: extraData, extraData: extraData,
); );
@@ -866,6 +867,7 @@ class Channel {
final reactionResp = await _client.sendReaction( final reactionResp = await _client.sendReaction(
messageId, messageId,
type, type,
score: score,
extraData: extraData, extraData: extraData,
enforceUnique: enforceUnique, enforceUnique: enforceUnique,
); );
@@ -1157,15 +1157,22 @@ class StreamChatClient {
Future<SendReactionResponse> sendReaction( Future<SendReactionResponse> sendReaction(
String messageId, String messageId,
String reactionType, { String reactionType, {
int score = 1,
Map<String, Object?> extraData = const {}, Map<String, Object?> extraData = const {},
bool enforceUnique = false, bool enforceUnique = false,
}) => }) {
_chatApi.message.sendReaction( final _extraData = {
messageId, 'score': score,
reactionType, ...extraData,
extraData: extraData, };
enforceUnique: enforceUnique,
); return _chatApi.message.sendReaction(
messageId,
reactionType,
extraData: _extraData,
enforceUnique: enforceUnique,
);
}
/// Delete a [reactionType] from this [messageId] /// Delete a [reactionType] from this [messageId]
Future<EmptyResponse> deleteReaction( Future<EmptyResponse> deleteReaction(
@@ -1116,6 +1116,135 @@ void main() {
verify(() => client.sendReaction(message.id, type)).called(1); verify(() => client.sendReaction(message.id, type)).called(1);
}); });
test('should work fine with score passed explicitly', () async {
const type = 'test-reaction-type';
final message = Message(id: 'test-message-id');
const score = 5;
final reaction = Reaction(
type: type,
messageId: message.id,
score: score,
);
when(() => client.sendReaction(
message.id,
type,
score: score,
)).thenAnswer(
(_) async => SendReactionResponse()
..message = message
..reaction = reaction,
);
expectLater(
// skipping first seed message list -> [] messages
channel.state?.messagesStream.skip(1),
emitsInOrder([
[
isSameMessageAs(
message.copyWith(
status: MessageSendingStatus.sent,
reactionCounts: {type: 1},
reactionScores: {type: score},
latestReactions: [reaction],
ownReactions: [reaction],
),
matchReactions: true,
matchSendingStatus: true,
),
],
]),
);
final res = await channel.sendReaction(
message,
type,
score: score,
);
expect(res, isNotNull);
expect(res.reaction.type, type);
expect(res.reaction.messageId, message.id);
expect(res.reaction.score, score);
verify(() => client.sendReaction(
message.id,
type,
score: score,
)).called(1);
});
test('should work fine with score passed explicitly and in extraData',
() async {
const type = 'test-reaction-type';
final message = Message(id: 'test-message-id');
const score = 5;
const extraDataScore = 3;
const extraData = {
'score': extraDataScore,
};
final reaction = Reaction(
type: type,
messageId: message.id,
score: extraDataScore,
);
when(() => client.sendReaction(
message.id,
type,
score: score,
extraData: extraData,
)).thenAnswer(
(_) async => SendReactionResponse()
..message = message
..reaction = reaction,
);
expectLater(
// skipping first seed message list -> [] messages
channel.state?.messagesStream.skip(1),
emitsInOrder([
[
isSameMessageAs(
message.copyWith(
status: MessageSendingStatus.sent,
reactionCounts: {type: 1},
reactionScores: {type: extraDataScore},
latestReactions: [reaction],
ownReactions: [reaction],
),
matchReactions: true,
matchSendingStatus: true,
),
],
]),
);
final res = await channel.sendReaction(
message,
type,
score: score,
extraData: extraData,
);
expect(res, isNotNull);
expect(res.reaction.type, type);
expect(res.reaction.messageId, message.id);
expect(
res.reaction.score,
extraDataScore,
);
verify(() => client.sendReaction(
message.id,
type,
score: score,
extraData: extraData,
)).called(1);
});
test( test(
'should restore previous message if `client.sendReaction` throws', 'should restore previous message if `client.sendReaction` throws',
() async { () async {
@@ -1956,23 +1956,109 @@ void main() {
verifyNoMoreInteractions(api.channel); verifyNoMoreInteractions(api.channel);
}); });
test('`.sendReaction`', () async { group('`.sendReaction`', () {
const messageId = 'test-message-id'; test('`.sendReaction with default params`', () async {
const reactionType = 'like'; const messageId = 'test-message-id';
const reactionType = 'like';
const extraData = {'score': 1};
when(() => api.message.sendReaction(messageId, reactionType)) when(() => api.message.sendReaction(
.thenAnswer((_) async => SendReactionResponse() messageId,
..message = Message(id: messageId) reactionType,
..reaction = Reaction(type: reactionType, messageId: messageId)); extraData: extraData,
)).thenAnswer((_) async => SendReactionResponse()
..message = Message(id: messageId)
..reaction = Reaction(type: reactionType, messageId: messageId));
final res = await client.sendReaction(messageId, reactionType); final res = await client.sendReaction(messageId, reactionType);
expect(res, isNotNull); expect(res, isNotNull);
expect(res.message.id, messageId); expect(res.message.id, messageId);
expect(res.reaction.type, reactionType); expect(res.reaction.type, reactionType);
expect(res.reaction.messageId, messageId); expect(res.reaction.messageId, messageId);
verify(() => api.message.sendReaction(messageId, reactionType)).called(1); verify(() => api.message.sendReaction(
verifyNoMoreInteractions(api.message); messageId,
reactionType,
extraData: extraData,
)).called(1);
verifyNoMoreInteractions(api.message);
});
test('`.sendReaction with score`', () async {
const messageId = 'test-message-id';
const reactionType = 'like';
const score = 3;
const extraData = {'score': score};
when(() => api.message.sendReaction(
messageId,
reactionType,
extraData: extraData,
)).thenAnswer((_) async => SendReactionResponse()
..message = Message(id: messageId)
..reaction = Reaction(
type: reactionType,
messageId: messageId,
score: score,
));
final res = await client.sendReaction(
messageId,
reactionType,
score: score,
);
expect(res, isNotNull);
expect(res.message.id, messageId);
expect(res.reaction.type, reactionType);
expect(res.reaction.messageId, messageId);
expect(res.reaction.score, score);
verify(() => api.message.sendReaction(
messageId,
reactionType,
extraData: extraData,
)).called(1);
verifyNoMoreInteractions(api.message);
});
test('`.sendReaction with score passed in extradata also`', () async {
const messageId = 'test-message-id';
const reactionType = 'like';
const score = 3;
const extraDataScore = 5;
const extraData = {'score': extraDataScore};
when(() => api.message.sendReaction(
messageId,
reactionType,
extraData: extraData,
)).thenAnswer((_) async => SendReactionResponse()
..message = Message(id: messageId)
..reaction = Reaction(
type: reactionType,
messageId: messageId,
score: extraDataScore,
));
final res = await client.sendReaction(
messageId,
reactionType,
score: score,
extraData: extraData,
);
expect(res, isNotNull);
expect(res.message.id, messageId);
expect(res.reaction.type, reactionType);
expect(res.reaction.messageId, messageId);
expect(res.reaction.score, extraDataScore);
verify(() => api.message.sendReaction(
messageId,
reactionType,
extraData: extraData,
)).called(1);
verifyNoMoreInteractions(api.message);
});
}); });
test('`.deleteReaction`', () async { test('`.deleteReaction`', () async {