Passed
Push — master ( 50ec1a...073efb )
by -
01:36
created

FlaskrTestCase.__delete_rule()   A

Complexity

Conditions 2

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2
Metric Value
cc 2
dl 0
loc 3
ccs 3
cts 3
cp 1
crap 2
rs 10
1 1
from time import strftime, localtime
2 1
import re
3
4 1
from sqlalchemy.orm.exc import UnmappedInstanceError
0 ignored issues
show
Configuration introduced by
The import sqlalchemy.orm.exc could not be resolved.

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
Unused Code introduced by
Unused UnmappedInstanceError imported from sqlalchemy.orm.exc
Loading history...
5
6 1
from spike import create_app
7 1
from spike.model import db
8 1
from spike.model.naxsi_rules import NaxsiRules
9
10 1
try:
11 1
    from urlparse import urlparse
12
except ImportError:  # python3
13
    from urllib.parse import urlparse
14
15 1
import unittest
16
17
18 1
class FlaskrTestCase(unittest.TestCase):
19 1
    def setUp(self):
20 1
        app = create_app()
21 1
        db.init_app(app)
22 1
        app.config['TESTING'] = True
23 1
        self.app = app.test_client()
24
25 1
    def tearDown(self):
26 1
        pass
27
28 1
    def __create_rule(self):
29
        """
30
31
        :return int: The id of the new rule
32
        """
33 1
        current_sid = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
34 1
        current_sid = 1337 if current_sid is None else current_sid.sid + 1
35
36 1
        db.session.add(NaxsiRules(u'POUET', 'str:test', u'BODY', u'$SQL:8', current_sid, u'web_server.rules',
37
                                  u'f hqewifueiwf hueiwhf uiewh fiewh fhw', '1', True, 1457101045))
38 1
        self.sid_to_delete = current_sid
0 ignored issues
show
Coding Style introduced by
The attribute sid_to_delete was defined outside __init__.

It is generally a good practice to initialize all attributes to default values in the __init__ method:

class Foo:
    def __init__(self, x=None):
        self.x = x
Loading history...
39 1
        return current_sid
40
41 1
    def __delete_rule(self, sid=None):
42 1
        sid = sid  if sid else self.sid_to_delete
43 1
        db.session.delete(NaxsiRules.query.filter(sid == NaxsiRules.sid).first())
44
45 1
    def test_index(self):
46 1
        rv = self.app.get('/', follow_redirects=True)
47 1
        self.assertEqual(rv.status_code, 200)
48 1
        self.assertIn('<title>SPIKE! - WAF Rules Builder</title>', rv.data)
49 1
        self.assertTrue(re.search(r'<h2>Naxsi - Rules \( \d+ \)</h2>', rv.data) is not None)
50
51 1
    def test_view(self):
52 1
        self.__create_rule()
53
54 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
55 1
        rv = self.app.get('/rules/view/%d' % _rule.sid)
56 1
        self.assertEqual(rv.status_code, 200)
57
58 1
        rv = self.app.get('/rules/view/%d' % (_rule.sid + 1))
59 1
        self.assertEqual(urlparse(rv.location).path, '/rules/')
60
61 1
        self.__delete_rule()
62
63 1
    def test_new_rule(self):
64 1
        data = {
65
            'msg': 'this is a test message',
66
            'detection': 'DETECTION',
67
            'mz': 'BODY',
68
            'custom_mz_val': '',
69
            'negative': 'checked',
70
            'score_$SQL': 8,
71
            'score': '$SQL',
72
            'rmks': 'this is a test remark',
73
            'ruleset': 'scanner.rules'
74
        }
75 1
        rv = self.app.post('/rules/new', data=data, follow_redirects=True)
76 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
77
78 1
        self.assertIn(('<li> - OK: created %d : %s</li>' % (_rule.sid, _rule.msg)), rv.data)
79 1
        self.assertEqual(_rule.msg, data['msg'])
80 1
        self.assertEqual(_rule.detection, 'str:' + data['detection'])
81 1
        self.assertEqual(_rule.mz, data['mz'])
82 1
        self.assertEqual(_rule.score, data['score'] + ':' + str(data['score_$SQL']))
83 1
        self.assertEqual(_rule.rmks, data['rmks'])
84 1
        self.assertEqual(_rule.ruleset, data['ruleset'])
85
86 1
        rv = self.app.get('/rules/new')
87 1
        self.assertEqual(rv.status_code, 200)
88
89 1
        self.__delete_rule(_rule.sid)
90
91 1
    def test_del_rule(self):
92 1
        old_sid = self.__create_rule()
93
94 1
        db.session.add(NaxsiRules(u'POUET', 'str:test', u'BODY', u'$SQL:8', old_sid + 1, u'web_server.rules',
95
                                  u'f hqewifueiwf hueiwhf uiewh fiewh fhw', '1', True, 1457101045))
96 1
        rv = self.app.get('/rules/del/%d' % (old_sid + 1))
97 1
        self.assertEqual(rv.status_code, 302)
98
99 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
100 1
        self.assertEqual(_rule.sid, old_sid)
101
102 1
        rv = self.app.get('/rules/del/%d' % (_rule.sid + 1))
103 1
        self.assertEqual(rv.status_code, 302)
104
105 1
        self.__delete_rule()
106
107 1
    def test_plain_rule(self):
108 1
        self.__create_rule()
109
110 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
111 1
        rv = self.app.get('/rules/plain/%d' % _rule.sid)
112 1
        self.assertEqual(rv.status_code, 200)
113 1
        rdate = strftime("%F - %H:%M", localtime(float(str(_rule.timestamp))))
114 1
        rmks = "# ".join(_rule.rmks.strip().split("\n"))
115 1
        detect = _rule.detection.lower() if _rule.detection.startswith("str:") else _rule.detection
116 1
        negate = 'negative' if _rule.negative == 1 else ''
117 1
        expected = """
118
#
119
# sid: %s | date: %s
120
#
121
# %s
122
#
123
MainRule %s "%s" "msg:%s" "mz:%s" "s:%s" id:%s ;
124
125
""" % (_rule.sid, rdate, rmks, negate, detect, _rule.msg, _rule.mz, _rule.score, _rule.sid)
126 1
        self.assertEqual(expected, rv.data)
127
128 1
        rv = self.app.get('/rules/plain/%d' % (_rule.sid + 1))
129 1
        self.assertEqual(rv.status_code, 302)
130
131 1
        self.__delete_rule()
132
133 1
    def test_deact_rule(self):
134 1
        rv = self.app.get('/rules/deact/')
135 1
        self.assertEqual(rv.status_code, 404)
136
137 1
        last_insert = self.__create_rule()
138 1
        non_existent_sid = last_insert + 1
139
140 1
        rv = self.app.get('/rules/deact/%d' % last_insert)  # deactivate
141 1
        self.assertEqual(rv.status_code, 200)
142 1
        _rule = NaxsiRules.query.filter(NaxsiRules.sid == last_insert).first()
143 1
        self.assertEqual(_rule.active, 0)
144
145 1
        rv = self.app.get('/rules/deact/%d' % last_insert)  # activate
146 1
        self.assertEqual(rv.status_code, 200)
147 1
        _rule = NaxsiRules.query.filter(NaxsiRules.sid == last_insert).first()
148 1
        self.assertEqual(_rule.active, 1)
149
150 1
        rv = self.app.get('/rules/deact/%d' % non_existent_sid)
151 1
        self.assertEqual(rv.status_code, 302)
152
153
154 1
        self.__delete_rule()
155
156 1
    def test_search_rule(self):
157
158 1
        self.__create_rule()
159 1
        rv = self.app.get('/rules/search/')
160 1
        self.assertEqual(rv.status_code, 302)
161
162 1
        rv = self.app.get('/rules/search/?s=a')
163 1
        self.assertEqual(rv.status_code, 302)
164
165 1
        rv = self.app.get('/rules/search/?s="OR 1=1;--')
166 1
        self.assertEqual(rv.status_code, 200)
167 1
        self.assertIn('<input type="text" name="s" size="20" value="&#34;OR 1=1;--"', rv.data)
168 1
        self.assertIn('<p><strong>Search: OR 11--</strong></p>', rv.data)  # filtered data
169
170 1
        rv = self.app.get('/rules/search/?s=1337')  # get rule by id
171 1
        self.assertEqual(rv.status_code, 200)
172
173 1
        self.__delete_rule()
174
175 1
    def test_edit_rule(self):
176 1
        non_nxistent_sid = self.__create_rule() + 1
177 1
        rv = self.app.get('/rules/edit/%d' % non_nxistent_sid)
178 1
        self.assertEqual(rv.status_code, 302)
179
180
        self.__delete_rule()
181