1# -*- coding: utf-8 -*-
2# Copyright (c) 2017 Pierre-Louis Bonicoli <pierre-louis@libregerbil.fr>
3# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
4
5from __future__ import (absolute_import, division, print_function)
6__metaclass__ = type
7
8import json
9
10from ansible_collections.community.general.plugins.modules.packaging.os import rhn_channel
11
12import pytest
13
14
15pytestmark = pytest.mark.usefixtures('patch_ansible_module')
16
17
18@pytest.mark.parametrize('patch_ansible_module', [{}], indirect=['patch_ansible_module'])
19def test_without_required_parameters(capfd):
20    with pytest.raises(SystemExit):
21        rhn_channel.main()
22    out, err = capfd.readouterr()
23    results = json.loads(out)
24    assert results['failed']
25    assert 'missing required arguments' in results['msg']
26
27
28TESTED_MODULE = rhn_channel.__name__
29TEST_CASES = [
30    [
31        # add channel already added, check that result isn't changed
32        {
33            'name': 'rhel-x86_64-server-6',
34            'sysname': 'server01',
35            'url': 'https://rhn.redhat.com/rpc/api',
36            'user': 'user',
37            'password': 'pass',
38        },
39        {
40            'calls': [
41                ('auth.login', ['X' * 43]),
42                ('system.listUserSystems',
43                 [[{'last_checkin': '2017-08-06 19:49:52.0', 'id': '0123456789', 'name': 'server01'}]]),
44                ('channel.software.listSystemChannels',
45                 [[{'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6'}]]),
46                ('auth.logout', [1]),
47            ],
48            'changed': False,
49            'msg': 'Channel rhel-x86_64-server-6 already exists',
50        }
51    ],
52    [
53        # add channel, check that result is changed
54        {
55            'name': 'rhel-x86_64-server-6-debuginfo',
56            'sysname': 'server01',
57            'url': 'https://rhn.redhat.com/rpc/api',
58            'user': 'user',
59            'password': 'pass',
60        },
61        {
62            'calls': [
63                ('auth.login', ['X' * 43]),
64                ('system.listUserSystems',
65                 [[{'last_checkin': '2017-08-06 19:49:52.0', 'id': '0123456789', 'name': 'server01'}]]),
66                ('channel.software.listSystemChannels',
67                 [[{'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6'}]]),
68                ('channel.software.listSystemChannels',
69                 [[{'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6'}]]),
70                ('system.setChildChannels', [1]),
71                ('auth.logout', [1]),
72            ],
73            'changed': True,
74            'msg': 'Channel rhel-x86_64-server-6-debuginfo added',
75        }
76    ],
77    [
78        # remove inexistent channel, check that result isn't changed
79        {
80            'name': 'rhel-x86_64-server-6-debuginfo',
81            'state': 'absent',
82            'sysname': 'server01',
83            'url': 'https://rhn.redhat.com/rpc/api',
84            'user': 'user',
85            'password': 'pass',
86        },
87        {
88            'calls': [
89                ('auth.login', ['X' * 43]),
90                ('system.listUserSystems',
91                 [[{'last_checkin': '2017-08-06 19:49:52.0', 'id': '0123456789', 'name': 'server01'}]]),
92                ('channel.software.listSystemChannels',
93                 [[{'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6'}]]),
94                ('auth.logout', [1]),
95            ],
96            'changed': False,
97            'msg': 'Not subscribed to channel rhel-x86_64-server-6-debuginfo.',
98        }
99    ],
100    [
101        # remove channel, check that result is changed
102        {
103            'name': 'rhel-x86_64-server-6-debuginfo',
104            'state': 'absent',
105            'sysname': 'server01',
106            'url': 'https://rhn.redhat.com/rpc/api',
107            'user': 'user',
108            'password': 'pass',
109        },
110        {
111            'calls': [
112                ('auth.login', ['X' * 43]),
113                ('system.listUserSystems',
114                 [[{'last_checkin': '2017-08-06 19:49:52.0', 'id': '0123456789', 'name': 'server01'}]]),
115                ('channel.software.listSystemChannels', [[
116                    {'channel_name': 'RHEL Server Debuginfo (v.6 for x86_64)', 'channel_label': 'rhel-x86_64-server-6-debuginfo'},
117                    {'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6'}
118                ]]),
119                ('channel.software.listSystemChannels', [[
120                    {'channel_name': 'RHEL Server Debuginfo (v.6 for x86_64)', 'channel_label': 'rhel-x86_64-server-6-debuginfo'},
121                    {'channel_name': 'Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64)', 'channel_label': 'rhel-x86_64-server-6'}
122                ]]),
123                ('system.setChildChannels', [1]),
124                ('auth.logout', [1]),
125            ],
126            'changed': True,
127            'msg': 'Channel rhel-x86_64-server-6-debuginfo removed'
128        }
129    ]
130]
131
132
133@pytest.mark.parametrize('patch_ansible_module, testcase', TEST_CASES, indirect=['patch_ansible_module'])
134def test_rhn_channel(capfd, mocker, testcase, mock_request):
135    """Check 'msg' and 'changed' results"""
136
137    with pytest.raises(SystemExit):
138        rhn_channel.main()
139
140    out, err = capfd.readouterr()
141    results = json.loads(out)
142    assert results['changed'] == testcase['changed']
143    assert results['msg'] == testcase['msg']
144    assert not testcase['calls']  # all calls should have been consumed
145