Files
talon/tests/signature/bruteforce_test.py
2016-07-12 17:25:46 +05:00

236 lines
6.0 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from .. import *
from talon.signature import bruteforce
def test_empty_body():
eq_(('', None), bruteforce.extract_signature(''))
def test_no_signature():
msg_body = 'Hey man!'
eq_((msg_body, None), bruteforce.extract_signature(msg_body))
def test_signature_only():
msg_body = '--\nRoman'
eq_((msg_body, None), bruteforce.extract_signature(msg_body))
def test_signature_separated_by_dashes():
msg_body = '''Hey man! How r u?
---
Roman'''
eq_(('Hey man! How r u?', '---\nRoman'),
bruteforce.extract_signature(msg_body))
msg_body = '''Hey!
-roman'''
eq_(('Hey!', '-roman'), bruteforce.extract_signature(msg_body))
msg_body = '''Hey!
- roman'''
eq_(('Hey!', '- roman'), bruteforce.extract_signature(msg_body))
msg_body = '''Wow. Awesome!
--
Bob Smith'''
eq_(('Wow. Awesome!', '--\nBob Smith'),
bruteforce.extract_signature(msg_body))
def test_signature_words():
msg_body = '''Hey!
Thanks!
Roman'''
eq_(('Hey!', 'Thanks!\nRoman'),
bruteforce.extract_signature(msg_body))
msg_body = '''Hey!
--
Best regards,
Roman'''
eq_(('Hey!', '--\nBest regards,\n\nRoman'),
bruteforce.extract_signature(msg_body))
msg_body = '''Hey!
--
--
Regards,
Roman'''
eq_(('Hey!', '--\n--\nRegards,\nRoman'),
bruteforce.extract_signature(msg_body))
def test_iphone_signature():
msg_body = '''Hey!
Sent from my iPhone!'''
eq_(('Hey!', 'Sent from my iPhone!'),
bruteforce.extract_signature(msg_body))
def test_mailbox_for_iphone_signature():
msg_body = """Blah
Sent from Mailbox for iPhone"""
eq_(("Blah", "Sent from Mailbox for iPhone"),
bruteforce.extract_signature(msg_body))
def test_line_starts_with_signature_word():
msg_body = '''Hey man!
Thanks for your attention.
--
Thanks!
Roman'''
eq_(('Hey man!\nThanks for your attention.', '--\nThanks!\nRoman'),
bruteforce.extract_signature(msg_body))
def test_line_starts_with_dashes():
msg_body = '''Hey man!
Look at this:
--> one
--> two
--
Roman'''
eq_(('Hey man!\nLook at this:\n\n--> one\n--> two', '--\nRoman'),
bruteforce.extract_signature(msg_body))
def test_blank_lines_inside_signature():
msg_body = '''Blah.
-Lev.
Sent from my HTC smartphone!'''
eq_(('Blah.', '-Lev.\n\nSent from my HTC smartphone!'),
bruteforce.extract_signature(msg_body))
msg_body = '''Blah
--
John Doe'''
eq_(('Blah', '--\n\nJohn Doe'), bruteforce.extract_signature(msg_body))
def test_blackberry_signature():
msg_body = """Heeyyoooo.
Sent wirelessly from my BlackBerry device on the Bell network.
Envoyé sans fil par mon terminal mobile BlackBerry sur le réseau de Bell."""
eq_(('Heeyyoooo.', msg_body[len('Heeyyoooo.\n'):]),
bruteforce.extract_signature(msg_body))
msg_body = u"""Blah
Enviado desde mi oficina móvil BlackBerry® de Telcel"""
eq_(('Blah', u'Enviado desde mi oficina móvil BlackBerry® de Telcel'),
bruteforce.extract_signature(msg_body))
@patch.object(bruteforce, 'get_delimiter', Mock(side_effect=Exception()))
def test_crash_in_extract_signature():
msg_body = '''Hey!
-roman'''
eq_((msg_body, None), bruteforce.extract_signature(msg_body))
def test_signature_cant_start_from_first_line():
msg_body = """Thanks,
Blah
regards
John Doe"""
eq_(('Thanks,\n\nBlah', 'regards\n\nJohn Doe'),
bruteforce.extract_signature(msg_body))
@patch.object(bruteforce, 'SIGNATURE_MAX_LINES', 2)
def test_signature_max_lines_ignores_empty_lines():
msg_body = """Thanks,
Blah
regards
John Doe"""
eq_(('Thanks,\nBlah', 'regards\n\n\nJohn Doe'),
bruteforce.extract_signature(msg_body))
def test_get_signature_candidate():
# if there aren't at least 2 non-empty lines there should be no signature
for lines in [], [''], ['', ''], ['abc']:
eq_([], bruteforce.get_signature_candidate(lines))
# first line never included
lines = ['text', 'signature']
eq_(['signature'], bruteforce.get_signature_candidate(lines))
# test when message is shorter then SIGNATURE_MAX_LINES
with patch.object(bruteforce, 'SIGNATURE_MAX_LINES', 3):
lines = ['text', '', '', 'signature']
eq_(['signature'], bruteforce.get_signature_candidate(lines))
# test when message is longer then the SIGNATURE_MAX_LINES
with patch.object(bruteforce, 'SIGNATURE_MAX_LINES', 2):
lines = ['text1', 'text2', 'signature1', '', 'signature2']
eq_(['signature1', '', 'signature2'],
bruteforce.get_signature_candidate(lines))
# test long lines not encluded
with patch.object(bruteforce, 'TOO_LONG_SIGNATURE_LINE', 3):
lines = ['BR,', 'long', 'Bob']
eq_(['Bob'], bruteforce.get_signature_candidate(lines))
# test list (with dashes as bullet points) not included
lines = ['List:,', '- item 1', '- item 2', '--', 'Bob']
eq_(['--', 'Bob'], bruteforce.get_signature_candidate(lines))
def test_mark_candidate_indexes():
with patch.object(bruteforce, 'TOO_LONG_SIGNATURE_LINE', 3):
# spaces are not considered when checking line length
eq_('clc',
bruteforce._mark_candidate_indexes(
['BR, ', 'long', 'Bob'],
[0, 1, 2]))
# only candidate lines are marked
# if line has only dashes it's a candidate line
eq_('ccdc',
bruteforce._mark_candidate_indexes(
['-', 'long', '-', '- i', 'Bob'],
[0, 2, 3, 4]))
def test_process_marked_candidate_indexes():
eq_([2, 13, 15],
bruteforce._process_marked_candidate_indexes(
[2, 13, 15], 'dcc'))
eq_([15],
bruteforce._process_marked_candidate_indexes(
[2, 13, 15], 'ddc'))
eq_([13, 15],
bruteforce._process_marked_candidate_indexes(
[13, 15], 'cc'))
eq_([15],
bruteforce._process_marked_candidate_indexes(
[15], 'lc'))
eq_([15],
bruteforce._process_marked_candidate_indexes(
[13, 15], 'ld'))