1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-11-10 06:46:15 +01:00
github.com_openSUSE_osc/tests/test_prdiff.py
Daniel Mach 056e6f1dde Improve 'osc rq show' output
* Add 'Created by' field
* Make formatting more consistent across the sections
2022-09-16 12:49:08 +02:00

258 lines
8.6 KiB
Python

import os
import re
import sys
import unittest
import osc.commandline
import osc.core
import osc.oscerr
from .common import GET, POST, OscTestCase, EXPECTED_REQUESTS
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'prdiff_fixtures')
UPSTREAM = 'some:project'
BRANCH = 'home:user:branches:' + UPSTREAM
def rdiff_url(pkg, oldprj, newprj):
return 'http://localhost/source/%s/%s?unified=1&opackage=%s&oproject=%s&cmd=diff&expand=1&tarlimit=0&filelimit=0' % \
(newprj, pkg, pkg, oldprj.replace(':', '%3A'))
def request_url(prj):
return "http://localhost/request" + f"?view=collection&project={prj}&states=new,review".replace(":", "%3A").replace(",", "%2C")
def GET_PROJECT_PACKAGES(*projects):
def decorator(test_method):
# decorators get applied in the reversed order (bottom-up)
for project in reversed(projects):
test_method = GET(f'http://localhost/source/{project}', file=f'{project}/directory')(test_method)
return test_method
return decorator
def POST_RDIFF(oldprj, newprj):
def decorator(test_method):
# decorators get applied in the reversed order (bottom-up)
test_method = POST(rdiff_url('common-three', oldprj, newprj), exp='', text='')(test_method)
test_method = POST(rdiff_url('common-two', oldprj, newprj), exp='', file='common-two-diff')(test_method)
test_method = POST(rdiff_url('common-one', oldprj, newprj), exp='', text='')(test_method)
return test_method
return decorator
def suite():
return unittest.defaultTestLoader.loadTestsFromTestCase(TestProjectDiff)
class TestProjectDiff(OscTestCase):
diff_hdr = 'Index: %s\n==================================================================='
def _get_fixtures_dir(self):
return FIXTURES_DIR
def _change_to_tmpdir(self, *args):
os.chdir(os.path.join(self.tmpdir, *args))
def _run_prdiff(self, *args):
"""Runs osc prdiff, returning captured STDOUT as a string."""
cli = osc.commandline.Osc()
argv = ['osc', '--no-keyring', 'prdiff']
argv.extend(args)
cli.main(argv=argv)
return sys.stdout.getvalue()
def testPrdiffTooManyArgs(self):
def runner():
self._run_prdiff('one', 'two', 'superfluous-arg')
self.assertRaises(osc.oscerr.WrongArgs, runner)
@GET_PROJECT_PACKAGES(UPSTREAM, BRANCH)
@POST_RDIFF(UPSTREAM, BRANCH)
@POST(rdiff_url('only-in-new', UPSTREAM, BRANCH), exp='', text='')
def testPrdiffZeroArgs(self):
exp = """identical: common-one
differs: common-two
identical: common-three
identical: only-in-new
"""
def runner():
self._run_prdiff()
os.chdir('/tmp')
self.assertRaises(osc.oscerr.WrongArgs, runner)
self._change_to_tmpdir(FIXTURES_DIR, UPSTREAM)
self.assertRaises(osc.oscerr.WrongArgs, runner)
self._change_to_tmpdir(FIXTURES_DIR, BRANCH)
out = self._run_prdiff()
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES(UPSTREAM, BRANCH)
@POST_RDIFF(UPSTREAM, BRANCH)
@POST(rdiff_url('only-in-new', UPSTREAM, BRANCH), exp='', text='')
def testPrdiffOneArg(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
identical: common-three
identical: only-in-new
"""
out = self._run_prdiff('home:user:branches:some:project')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST_RDIFF('old:prj', 'new:prj')
def testPrdiffTwoArgs(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
identical: common-three
"""
out = self._run_prdiff('old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST_RDIFF('old:prj', 'new:prj')
def testPrdiffOldOnly(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
identical: common-three
old only: only-in-old
"""
out = self._run_prdiff('--show-not-in-new', 'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST_RDIFF('old:prj', 'new:prj')
def testPrdiffNewOnly(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
identical: common-three
new only: only-in-new
"""
out = self._run_prdiff('--show-not-in-old', 'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST_RDIFF('old:prj', 'new:prj')
def testPrdiffDiffstat(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
common-two | 1 +
1 file changed, 1 insertion(+)
identical: common-three
"""
out = self._run_prdiff('--diffstat', 'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST_RDIFF('old:prj', 'new:prj')
def testPrdiffUnified(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
Index: common-two
===================================================================
--- common-two\t2013-01-18 19:18:38.225983117 +0000
+++ common-two\t2013-01-18 19:19:27.882082325 +0000
@@ -1,4 +1,5 @@
line one
line two
line three
+an extra line
last line
identical: common-three
"""
out = self._run_prdiff('--unified', 'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST(rdiff_url('common-two', 'old:prj', 'new:prj'), exp='', file='common-two-diff')
@POST(rdiff_url('common-three', 'old:prj', 'new:prj'), exp='', text='')
def testPrdiffInclude(self):
self._change_to_tmpdir()
exp = """differs: common-two
identical: common-three
"""
out = self._run_prdiff('--include', 'common-t',
'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST(rdiff_url('common-two', 'old:prj', 'new:prj'), exp='', file='common-two-diff')
@POST(rdiff_url('common-three', 'old:prj', 'new:prj'), exp='', text='')
def testPrdiffExclude(self):
self._change_to_tmpdir()
exp = """differs: common-two
identical: common-three
"""
out = self._run_prdiff('--exclude', 'one', 'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES('old:prj', 'new:prj')
@POST(rdiff_url('common-two', 'old:prj', 'new:prj'), exp='', file='common-two-diff')
def testPrdiffIncludeExclude(self):
self._change_to_tmpdir()
exp = """differs: common-two
"""
out = self._run_prdiff('--include', 'common-t',
'--exclude', 'three',
'old:prj', 'new:prj')
self.assertEqualMultiline(out, exp)
@GET_PROJECT_PACKAGES(UPSTREAM, BRANCH)
@GET(request_url(UPSTREAM), exp='', file='request')
@POST(rdiff_url('common-one', UPSTREAM, BRANCH), exp='', text='')
@POST(rdiff_url('common-two', UPSTREAM, BRANCH), exp='', file='common-two-diff')
@POST(rdiff_url('common-three', UPSTREAM, BRANCH), exp='', file='common-two-diff')
@POST(rdiff_url('only-in-new', UPSTREAM, BRANCH), exp='', text='')
def testPrdiffRequestsMatching(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
148023 State:new By:user When:2013-01-11T11:04:14
Created by: creator
submit: home:user:branches:some:project/common-two@7 -> some:project
Descr: - Fix it to work - Improve support for something
differs: common-three
identical: only-in-new
"""
out = self._run_prdiff('--requests', UPSTREAM, BRANCH)
self.assertEqualMultiline(out, exp)
# Reverse the direction of the diff.
@GET_PROJECT_PACKAGES(BRANCH, UPSTREAM)
@GET(request_url(BRANCH), exp='', file='no-requests')
@POST(rdiff_url('common-one', BRANCH, UPSTREAM), exp='', text='')
@POST(rdiff_url('common-two', BRANCH, UPSTREAM), exp='', file='common-two-diff')
@POST(rdiff_url('common-three', BRANCH, UPSTREAM), exp='', file='common-two-diff')
@POST(rdiff_url('only-in-new', BRANCH, UPSTREAM), exp='', text='')
def testPrdiffRequestsSwitched(self):
self._change_to_tmpdir()
exp = """identical: common-one
differs: common-two
differs: common-three
identical: only-in-new
"""
out = self._run_prdiff('--requests', BRANCH, UPSTREAM)
self.assertEqualMultiline(out, exp)
if __name__ == '__main__':
unittest.main()