File: test_discuss_sub_channels.py

package info (click to toggle)
odoo 18.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 878,716 kB
  • sloc: javascript: 927,937; python: 685,670; xml: 388,524; sh: 1,033; sql: 415; makefile: 26
file content (135 lines) | stat: -rw-r--r-- 7,569 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from datetime import datetime, timedelta
from freezegun import freeze_time

from odoo.tests.common import HttpCase, new_test_user, tagged
from odoo.exceptions import UserError, ValidationError


@tagged("post_install", "-at_install")
class TestDiscussSubChannels(HttpCase):
    def test_01_gc_unpin_outdated_sub_channels(self):
        parent = self.env["discuss.channel"].create({"name": "General"})
        parent._create_sub_channel()
        sub_channel = parent.sub_channel_ids[0]
        sub_channel.add_members(partner_ids=[self.env.user.partner_id.id])
        sub_channel.channel_pin(pinned=True)
        self_member = sub_channel.channel_member_ids.filtered(lambda m: m.is_self)
        self.assertTrue(self_member.is_pinned)
        # Last interrest of the member is older than 2 days, no activity on the
        # channel: should be unpinned.
        two_days_later_dt = datetime.now() + timedelta(days=3)
        with freeze_time(two_days_later_dt):
            self.env["discuss.channel.member"]._gc_unpin_outdated_sub_channels()
            self.assertFalse(self_member.is_pinned)
        # Last interrest of the member is older than 2 days, activity on the
        # channel: should be kept.
        sub_channel.channel_pin(pinned=True)
        with freeze_time(two_days_later_dt):
            sub_channel.message_post(body="Hey!")
            self.env["discuss.channel.member"]._gc_unpin_outdated_sub_channels()
            self.assertTrue(self_member.is_pinned)

    def test_02_sub_channel_members_sync_with_parent(self):
        parent = self.env["discuss.channel"].create({"name": "General"})
        parent.action_unfollow()
        self.assertFalse(any(m.is_self for m in parent.channel_member_ids))
        parent._create_sub_channel()
        sub_channel = parent.sub_channel_ids[0]
        # Member created for sub channel (_create_sub_channel): should also be
        # created for the parent channel.
        self.assertTrue(any(m.is_self for m in parent.channel_member_ids))
        self.assertTrue(any(m.is_self for m in sub_channel.channel_member_ids))
        # Member removed from parent channel: should also be removed from the sub
        # channel.
        parent.action_unfollow()
        self.assertFalse(any(m.is_self for m in parent.channel_member_ids))
        self.assertFalse(any(m.is_self for m in sub_channel.channel_member_ids))
        # Member created for sub channel (add_members): should also be created
        # for parent.
        sub_channel.add_members(partner_ids=[self.env.user.partner_id.id])
        self.assertTrue(any(m.is_self for m in parent.channel_member_ids))
        self.assertTrue(any(m.is_self for m in sub_channel.channel_member_ids))

    def test_03_cannot_create_recursive_sub_channel(self):
        parent = self.env["discuss.channel"].create({"name": "General"})
        parent._create_sub_channel()
        sub_channel = parent.sub_channel_ids[0]
        with self.assertRaises(ValidationError):
            sub_channel._create_sub_channel()

    def test_04_sub_channel_panel_search(self):
        bob_user = new_test_user(self.env, "bob_user", groups="base.group_user")
        self.authenticate("bob_user", "bob_user")
        channel = self.env["discuss.channel"].channel_create(name="General", group_id=None)
        channel.add_members(partner_ids=[bob_user.partner_id.id])
        for i in range(100):
            channel._create_sub_channel(name=f"Sub Channel {i}")
        self.start_tour(
            f"/odoo/discuss?active_id=discuss.channel_{channel.id}",
            "test_discuss_sub_channel_search",
            login="bob_user",
        )

    def test_05_cannot_upate_first_message_nor_parent_channel(self):
        parent = self.env["discuss.channel"].create({"name": "General"})
        parent.message_post(body="Hello there!")
        parent._create_sub_channel(from_message_id=parent.message_ids[0].id)
        sub_channel = parent.sub_channel_ids[0]
        random_channel = self.env["discuss.channel"].create({"name": "Random"})
        parent.message_post(body="Random message")
        with self.assertRaises(UserError, msg="Cannot change initial message nor parent channel of: Hello there!."):
            sub_channel.parent_channel_id = random_channel
        with self.assertRaises(UserError, msg="Cannot change initial message nor parent channel of: Hello there!."):
            sub_channel.from_message_id = parent.message_ids[0]

    def test_06_initial_message_must_belong_to_parent_channel(self):
        parent = self.env["discuss.channel"].create({"name": "General"})
        random_channel = self.env["discuss.channel"].create({"name": "Random"})
        random_channel.message_post(body="Hello world!")
        with self.assertRaises(
            ValidationError,
            msg="Cannot create Hello world!: initial message should belong to parent channel.",
        ):
            parent._create_sub_channel(from_message_id=random_channel.message_ids[0].id)

    def test_07_unlink_sub_channel(self):
        bob_user = new_test_user(self.env, "bob_user", groups="base.group_user")
        baz_user = new_test_user(self.env, "baz_user", groups="base.group_user")
        parent_1 = self.env["discuss.channel"].with_user(bob_user).create({"name": "Parent 1"})
        parent_1_baz_member = parent_1.add_members(partner_ids=[baz_user.partner_id.id])
        parent_1_sub_channel_1 = parent_1._create_sub_channel(name="Parent 1 Sub 1")
        parent_1_sub_channel_1.add_members(partner_ids=[baz_user.partner_id.id])
        parent_1_sub_channel_2 = parent_1._create_sub_channel(name="Parent 1 Sub 2")
        parent_1_sub_channel_2.add_members(partner_ids=[baz_user.partner_id.id])
        parent_2 = self.env["discuss.channel"].with_user(baz_user).create({"name": "Parent 2"})
        parent_2_bob_member = parent_2.add_members(partner_ids=[bob_user.partner_id.id])
        parent_2_sub_channel = parent_2._create_sub_channel(name="Parent 2 Sub")
        parent_2_sub_channel.add_members(partner_ids=[bob_user.partner_id.id])
        parent_3 = self.env["discuss.channel"].with_user(bob_user).create({"name": "Parent 3"})
        guest = self.env["mail.guest"].create({"name": "Guest"})
        parent_3_guest_member = parent_3.add_members(guest_ids=[guest.id])
        parent_3_sub_channel = parent_3._create_sub_channel(name="Parent 3 Sub")
        parent_3_sub_channel.add_members(guest_ids=[guest.id])
        members_to_unlink = parent_1_baz_member + parent_2_bob_member + parent_3_guest_member
        members_to_unlink.sudo().unlink()
        self.assertNotIn(
            baz_user.partner_id,
            parent_1.channel_member_ids.partner_id
            | parent_1.sub_channel_ids.channel_member_ids.partner_id,
        )
        self.assertNotIn(
            bob_user.partner_id,
            parent_2.channel_member_ids.partner_id
            | parent_2.sub_channel_ids.channel_member_ids.partner_id,
        )
        self.assertNotIn(
            guest,
            parent_3.channel_member_ids.guest_id
            | parent_3.sub_channel_ids.channel_member_ids.guest_id,
        )
        self.assertIn(bob_user.partner_id, parent_1_sub_channel_1.channel_member_ids.partner_id)
        self.assertIn(bob_user.partner_id, parent_1_sub_channel_2.channel_member_ids.partner_id)
        self.assertIn(baz_user.partner_id, parent_2_sub_channel.channel_member_ids.partner_id)
        self.assertIn(bob_user.partner_id, parent_3_sub_channel.channel_member_ids.partner_id)