From 5d2eebec15e087a91594778090bcc06ce00d8927 Mon Sep 17 00:00:00 2001 From: Paul Horton Date: Fri, 17 Dec 2021 12:03:33 +0000 Subject: [PATCH] test: migrated test_parser to unittest and added some minor test fixes Signed-off-by: Paul Horton --- tests/reqfiles/editable_2.expected | 20 ++++-- tests/test_parser.py | 101 +++++++++++++++++------------ 2 files changed, 77 insertions(+), 44 deletions(-) diff --git a/tests/reqfiles/editable_2.expected b/tests/reqfiles/editable_2.expected index f988e60..e105225 100644 --- a/tests/reqfiles/editable_2.expected +++ b/tests/reqfiles/editable_2.expected @@ -10,7 +10,10 @@ "path": null, "line": "-e svn+svn://svn.myproject.org/svn/MyProject#egg=MyProject # Test comment", "specs": [], - "revision": null + "revision": null, + "hash": null, + "hash_name": null, + "subdirectory": null }, { "specifier": false, @@ -23,7 +26,10 @@ "path": null, "line": "-e git://git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject # Test comment", "specs": [], - "revision": "da39a3ee5e6b4b0d3255bfef95601890afd80709" + "revision": "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "hash": null, + "hash_name": null, + "subdirectory": null }, { "specifier": false, @@ -36,7 +42,10 @@ "path": null, "line": "-e hg+http://hg.myproject.org/MyProject/@special_feature#egg=MyProject # Test comment", "specs": [], - "revision": "special_feature" + "revision": "special_feature", + "hash": null, + "hash_name": null, + "subdirectory": null }, { "specifier": false, @@ -49,6 +58,9 @@ "path": null, "line": "-e bzr+lp://MyProject#egg=MyProject # Test comment", "specs": [], - "revision": null + "revision": null, + "hash": null, + "hash_name": null, + "subdirectory": null } ] diff --git a/tests/test_parser.py b/tests/test_parser.py index f20e413..5b9b6fb 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -1,15 +1,71 @@ -import os +# encoding: utf-8 + +# This file is part of requirements-parser library. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + import json -from nose.tools import raises, assert_equal import warnings +from os import listdir +from os.path import dirname, isfile, join +from types import GeneratorType +from unittest import TestCase from requirements import parse -REQFILE_DIR = os.path.join(os.path.dirname(__file__), 'reqfiles') +class TestParser(TestCase): + _requirements_files_dir: str + + @classmethod + def setUpClass(cls) -> None: + cls._requirements_files_dir = join(dirname(__file__), 'reqfiles') + + def test_1(self) -> None: + self._test_req_file(req_file='specs_1.txt') + + def test_requirement_files(self) -> None: + for fn in listdir(TestParser._requirements_files_dir): + fp = join(TestParser._requirements_files_dir, fn) + + # skip ".expected" files + if not isfile(fp) or not fp.endswith('.txt'): + continue + + self._test_req_file(req_file=fn) -def listify(iterable): + def _test_req_file(self, req_file: str): + fp = join(TestParser._requirements_files_dir, req_file) + with open(fp) as req_fh: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + parsed = parse(req_fh) + + if 'fail' in req_file: + with self.assertRaises(ValueError): + list([dict(r) for r in parsed]) + else: + with open(fp[:-4] + '.expected', 'r') as f2: + self.assertIsInstance(parsed, GeneratorType) + self.assertEqual(json.loads(f2.read()), listify(dict(r) for r in parsed), + msg=f'Failed on {fp}') + + +def listify(iterable: GeneratorType) -> list: out = [] + for item in iterable: if isinstance(item, dict): for key, value in item.items(): @@ -17,43 +73,8 @@ def listify(iterable): if key in ('extras', 'specs'): # enforce predictability item[key] = sorted(listify(value)) - else: - item[key] = listify(value) + # item[key] = listify(value) elif isinstance(item, (tuple, list)): item = listify(item) out.append(item) return out - - -def test_requirement_files(): - for fn in os.listdir(REQFILE_DIR): - def fancy(f): - f.description = "%s.%s: %s" % (f.__module__, f.__name__, fn) - return f - - @fancy - @raises(ValueError) - def check_fail(s): - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - list([dict(r) for r in parse(s)]) - - @fancy - def check(s, expected): - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - assert_equal(listify(dict(r) for r in parse(s)), expected) - - fp = os.path.join(REQFILE_DIR, fn) - - # skip ".expected" files - if not os.path.isfile(fp) or not fp.endswith('.txt'): - continue - - if 'fail' in fn: - yield check_fail, open(fp) - else: - with open(fp[:-4] + '.expected', 'r') as f2: - expected = json.loads(f2.read()) - yield check, open(fp), expected -