review/tests/test_signoff.py @ 9030dc9517cf

web: add basic tests

This patch adds a new test module `test_web` to automate testing of web
requests. For now the tests are rather simple and only check for
expected status codes.

To set up the flask app within the tests, it has to be configured
properly. This is the reason why the app configuration part in `web.py`
has been moved into an own function - now it may also be used by the
test module.
author Oben Sonne <obensonne@googlemail.com>
date Mon, 02 Jul 2012 22:32:48 +0200
parents bef3dce04be6
children (none)
from nose import with_setup
from util import setup_reviewed_sandbox, teardown_sandbox, review, should_fail_with
from util import get_datastore_repo, get_sandbox_repo, get_ui

from .. import api, messages

from mercurial.node import hex

# TODO: Figure out how to handle external editors nicely with nose.

s1, s2 = (messages.REVIEW_LOG_SIGNOFF_AUTHOR % ('|', 'neutral')).split('|')
sy1, sy2 = (messages.REVIEW_LOG_SIGNOFF_AUTHOR % ('|', 'yes')).split('|')
sn1, sn2 = (messages.REVIEW_LOG_SIGNOFF_AUTHOR % ('|', 'no')).split('|')

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_no_signoffs():
    output = review()
    assert messages.REVIEW_LOG_SIGNOFFS % (0, 0, 0, 0) in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_formatting():
    review(signoff=True, message=' \tTest signoff one.\t ')
    output = review()

    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test signoff one.' in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % ' \tTest signoff one.' not in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test signoff one.\t ' not in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % ' \tTest signoff one.\t ' not in output

    review(rev=0, signoff=True,
           message=' \tTest\n  indented\n\ttabindented\noutdented  \ndone\t ')
    output = review(rev=0)

    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test' in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % '  indented' in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % '\ttabindented' in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'outdented  ' in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'done' in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_styles():
    review(signoff=True, message='Test signoff one.', mdown=True)
    output = review()

    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test signoff one.' in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_on_parent_rev():
    review(signoff=True, message='Test signoff one.')

    output = review()
    assert messages.REVIEW_LOG_SIGNOFFS % (1, 0, 0, 1) in output

    assert s1 in output
    assert s1 in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test signoff one.' in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_on_specific_rev():
    review(signoff=True, message='Test signoff one.', rev='0')

    output = review(rev='0')
    assert messages.REVIEW_LOG_SIGNOFFS % (1, 0, 0, 1) in output

    output = review()
    assert messages.REVIEW_LOG_SIGNOFFS % (0, 0, 0, 0) in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_multiple_signoffs():
    review(signoff=True, message='Test signoff one.')

    should_fail_with(messages.SIGNOFF_EXISTS, signoff=True, message='Test signoff two.')

    output = review()
    assert messages.REVIEW_LOG_SIGNOFFS % (1, 0, 0, 1) in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_yes():
    review(signoff=True, yes=True, message='Test signoff one.')

    output = review()
    assert messages.REVIEW_LOG_SIGNOFFS % (1, 1, 0, 0) in output

    assert sy1 in output
    assert sy1 in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test signoff one.' in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_no():
    review(signoff=True, no=True, message='Test signoff one.')

    output = review()
    assert messages.REVIEW_LOG_SIGNOFFS % (1, 0, 1, 0) in output

    assert sn1 in output
    assert sn1 in output
    assert messages.REVIEW_LOG_SIGNOFF_LINE % 'Test signoff one.' in output

@with_setup(setup_reviewed_sandbox(), teardown_sandbox)
def test_signoff_identifiers():
    review(signoff=True, message='Test signoff one.', rev='0')

    rd = api.ReviewDatastore(get_ui(), get_sandbox_repo())
    dsr = get_datastore_repo()

    signoff = rd['0'].signoffs[0]

    identifier = signoff.identifier
    short_identifier = identifier[:12]

    signoff_filename = api._split_path_dammit(dsr['tip'].files()[0])[-1]
    signoff_cset = hex(dsr['tip'].node())

    assert identifier == signoff_filename
    assert identifier != signoff_cset

    verbose_identifier = messages.REVIEW_LOG_IDENTIFIER % identifier[:12]
    debug_identifier = messages.REVIEW_LOG_IDENTIFIER % identifier

    normal_output = review(rev='0')
    assert verbose_identifier not in normal_output
    assert debug_identifier not in normal_output

    verbose_output = review(rev='0', verbose=True)
    assert verbose_identifier in verbose_output
    assert debug_identifier not in verbose_output

    debug_output = review(rev='0', debug=True)
    assert verbose_identifier not in debug_output
    assert debug_identifier in debug_output