summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/tests/test_home.py
blob: 0b788626048df87c8f4a001370de49b17b1a70c7 (plain)
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
from __future__ import absolute_import

import logging
import os

try:
    import mock
except ImportError:
    import unittest.mock as mock

from .. import mgr
from ..controllers.home import HomeController, LanguageMixin
from ..tests import ControllerTestCase, FakeFsMixin

logger = logging.getLogger()


class HomeTest(ControllerTestCase, FakeFsMixin):
    @classmethod
    def setup_server(cls):
        frontend_path = mgr.get_frontend_path()
        cls.fs.reset()
        cls.fs.create_dir(frontend_path)
        cls.fs.create_file(
            os.path.join(frontend_path, '..', 'package.json'),
            contents='{"config":{"locale": "en"}}')
        with mock.patch(cls.builtins_open, new=cls.f_open),\
                mock.patch('os.listdir', new=cls.f_os.listdir):
            lang = LanguageMixin()
            cls.fs.create_file(
                os.path.join(lang.DEFAULT_LANGUAGE_PATH, 'index.html'),
                contents='<!doctype html><html lang="en"><body></body></html>')
            cls.setup_controllers([HomeController])

    @mock.patch(FakeFsMixin.builtins_open, new=FakeFsMixin.f_open)
    @mock.patch('os.stat', new=FakeFsMixin.f_os.stat)
    @mock.patch('os.listdir', new=FakeFsMixin.f_os.listdir)
    def test_home_default_lang(self):
        self._get('/')
        self.assertStatus(200)
        logger.info(self.body)
        self.assertIn('<html lang="en">', self.body.decode('utf-8'))

    @mock.patch(FakeFsMixin.builtins_open, new=FakeFsMixin.f_open)
    @mock.patch('os.stat', new=FakeFsMixin.f_os.stat)
    @mock.patch('os.listdir', new=FakeFsMixin.f_os.listdir)
    def test_home_uplevel_check(self):
        self._get('/../../../../../../etc/shadow')
        self.assertStatus(403)

    @mock.patch(FakeFsMixin.builtins_open, new=FakeFsMixin.f_open)
    @mock.patch('os.stat', new=FakeFsMixin.f_os.stat)
    @mock.patch('os.listdir', new=FakeFsMixin.f_os.listdir)
    def test_home_en(self):
        self._get('/', headers=[('Accept-Language', 'en-US')])
        self.assertStatus(200)
        logger.info(self.body)
        self.assertIn('<html lang="en">', self.body.decode('utf-8'))

    @mock.patch(FakeFsMixin.builtins_open, new=FakeFsMixin.f_open)
    @mock.patch('os.stat', new=FakeFsMixin.f_os.stat)
    @mock.patch('os.listdir', new=FakeFsMixin.f_os.listdir)
    def test_home_non_supported_lang(self):
        self._get('/', headers=[('Accept-Language', 'NO-NO')])
        self.assertStatus(200)
        logger.info(self.body)
        self.assertIn('<html lang="en">', self.body.decode('utf-8'))

    @mock.patch(FakeFsMixin.builtins_open, new=FakeFsMixin.f_open)
    @mock.patch('os.stat', new=FakeFsMixin.f_os.stat)
    @mock.patch('os.listdir', new=FakeFsMixin.f_os.listdir)
    def test_home_multiple_subtags_lang(self):
        self._get('/', headers=[('Accept-Language', 'zh-Hans-CN')])
        self.assertStatus(200)