def test_extract(element, expr, expect, build_first): extractor = JSONExtractor(expr) assert not extractor.built if build_first: extractor.build() assert extractor.built assert expect == extractor.extract(element) assert extractor.built
def test_extract_first_without_default(element, expr, build_first): extractor = JSONExtractor(expr) if build_first: extractor.build() with pytest.raises(ExtractError) as catch: extractor.extract_first(element) exc = catch.value assert len(exc.extractors) == 1 assert exc.extractors[0] is extractor assert exc.element is element
def test_invalid_css_selector_expr(element, expr, by): extractor = JSONExtractor(expr) with pytest.raises(ExprError) as catch: if by == "build": extractor.build() elif by == "extract": extractor.extract(element) exc = catch.value assert exc.extractor is extractor if (data_extractor.json.json_extractor_backend is data_extractor.json.JSONPathExtractor): # JSONExtractor implementated by 'jsonpath-extractor' # only raise SyntaxError in build method assert isinstance(exc.exc, SyntaxError) else: from jsonpath_rw.lexer import JsonPathLexerError assert isinstance(exc.exc, (JsonPathLexerError, Exception)) assert re.match(r"ExprError with .+? raised by .+? extracting", str(exc))
def test_extract_first(element, expr, expect, build_first): extractor = JSONExtractor(expr) if build_first: extractor.build() assert expect == extractor.extract_first(element, default="default")