Coverage for src/tests/test_discussions.py: 100%

76 statements  

« prev     ^ index     » next       coverage.py v7.6.10, created at 2025-03-11 15:27 +0000

1import grpc 

2import pytest 

3 

4from couchers import errors 

5from couchers.db import session_scope 

6from couchers.utils import now, to_aware_datetime 

7from proto import discussions_pb2, notifications_pb2 

8from tests.test_communities import create_community, create_group 

9from tests.test_fixtures import ( # noqa 

10 db, 

11 discussions_session, 

12 generate_user, 

13 notifications_session, 

14 process_jobs, 

15 push_collector, 

16 testconfig, 

17) 

18 

19 

20@pytest.fixture(autouse=True) 

21def _(testconfig): 

22 pass 

23 

24 

25def test_create_discussion_errors(db): 

26 user, token = generate_user() 

27 with discussions_session(token) as api: 

28 with pytest.raises(grpc.RpcError) as e: 

29 api.CreateDiscussion( 

30 discussions_pb2.CreateDiscussionReq( 

31 title=None, 

32 content="dummy content", 

33 ) 

34 ) 

35 assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT 

36 assert e.value.details() == errors.MISSING_DISCUSSION_TITLE 

37 

38 with discussions_session(token) as api: 

39 with pytest.raises(grpc.RpcError) as e: 

40 api.CreateDiscussion( 

41 discussions_pb2.CreateDiscussionReq( 

42 title="dummy title", 

43 content=None, 

44 ) 

45 ) 

46 assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT 

47 assert e.value.details() == errors.MISSING_DISCUSSION_CONTENT 

48 

49 

50def test_create_and_get_discussion(db, push_collector): 

51 generate_user() 

52 user, token = generate_user() 

53 user2, token2 = generate_user() 

54 generate_user() 

55 generate_user() 

56 

57 with notifications_session(token2) as notifications: 

58 notifications.SetNotificationSettings( 

59 notifications_pb2.SetNotificationSettingsReq( 

60 preferences=[ 

61 notifications_pb2.SingleNotificationPreference( 

62 topic="discussion", 

63 action="create", 

64 delivery_method="push", 

65 enabled=True, 

66 ) 

67 ], 

68 ) 

69 ) 

70 

71 with session_scope() as session: 

72 community = create_community(session, 0, 1, "Testing Community", [user2], [], None) 

73 group_id = create_group(session, "Testing Group", [user2], [], community).id 

74 community_id = community.id 

75 user2_id = user2.id 

76 

77 with discussions_session(token) as api: 

78 time_before_create = now() 

79 res = api.CreateDiscussion( 

80 discussions_pb2.CreateDiscussionReq( 

81 title="dummy title", 

82 content="dummy content", 

83 owner_community_id=community_id, 

84 ) 

85 ) 

86 time_after_create = now() 

87 

88 assert res.title == "dummy title" 

89 assert res.content == "dummy content" 

90 assert res.slug == "dummy-title" 

91 assert time_before_create <= to_aware_datetime(res.created) <= time_after_create 

92 assert res.creator_user_id == user.id 

93 assert res.owner_community_id == community_id 

94 

95 discussion_id = res.discussion_id 

96 

97 process_jobs() 

98 

99 push_collector.assert_user_has_single_matching( 

100 user2_id, 

101 title="dummy title", 

102 body=f"{user.name} created a discussion in Testing Community: dummy title\n\ndummy content", 

103 ) 

104 

105 with discussions_session(token) as api: 

106 res = api.GetDiscussion( 

107 discussions_pb2.GetDiscussionReq( 

108 discussion_id=discussion_id, 

109 ) 

110 ) 

111 

112 assert res.title == "dummy title" 

113 assert res.content == "dummy content" 

114 assert res.slug == "dummy-title" 

115 assert time_before_create <= to_aware_datetime(res.created) <= time_after_create 

116 assert res.creator_user_id == user.id 

117 assert res.owner_community_id == community_id 

118 

119 with discussions_session(token) as api: 

120 time_before_create = now() 

121 res = api.CreateDiscussion( 

122 discussions_pb2.CreateDiscussionReq( 

123 title="dummy title", 

124 content="dummy content", 

125 owner_group_id=group_id, 

126 ) 

127 ) 

128 time_after_create = now() 

129 

130 assert res.title == "dummy title" 

131 assert res.content == "dummy content" 

132 assert res.slug == "dummy-title" 

133 assert time_before_create <= to_aware_datetime(res.created) <= time_after_create 

134 assert res.creator_user_id == user.id 

135 assert res.owner_group_id == group_id 

136 

137 discussion_id = res.discussion_id 

138 

139 with discussions_session(token) as api: 

140 res = api.GetDiscussion( 

141 discussions_pb2.GetDiscussionReq( 

142 discussion_id=discussion_id, 

143 ) 

144 ) 

145 

146 assert res.title == "dummy title" 

147 assert res.content == "dummy content" 

148 assert res.slug == "dummy-title" 

149 assert time_before_create <= to_aware_datetime(res.created) <= time_after_create 

150 assert res.creator_user_id == user.id 

151 assert res.owner_group_id == group_id