Skip to content

Commit

Permalink
test: migrated test_parser to unittest and added some minor test fixes
Browse files Browse the repository at this point in the history
Signed-off-by: Paul Horton <[email protected]>
  • Loading branch information
madpah committed Dec 17, 2021
1 parent 82f9473 commit 5d2eebe
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 44 deletions.
20 changes: 16 additions & 4 deletions tests/reqfiles/editable_2.expected
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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
}
]
101 changes: 61 additions & 40 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
@@ -1,59 +1,80 @@
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():
if isinstance(item[key], (tuple, list)):
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

0 comments on commit 5d2eebe

Please sign in to comment.