#!/usr/bin/python
# -*- coding: utf-8 -*-
"""Test the jsonpath module."""
from unittest import TestCase
from jsonpath2.path import Path
[docs]class TestBookStore(TestCase):
"""
Test the bookstore from original jsonpath article.
http://goessner.net/articles/JsonPath/
"""
[docs] def setUp(self):
"""Setup the class."""
self.root_value = {
'store': {
'book': [
{
'category': 'reference',
'author': 'Nigel Rees',
'title': 'Sayings of the Century',
'price': 8.95
},
{
'category': 'fiction',
'author': 'Evelyn Waugh',
'title': 'Sword of Honour',
'price': 12.99
},
{
'category': 'fiction',
'author': 'Herman Melville',
'title': 'Moby Dick',
'isbn': '0-553-21311-3',
'price': 8.99
},
{
'category': 'fiction',
'author': 'J. R. R. Tolkien',
'title': 'The Lord of the Rings',
'isbn': '0-395-19395-8',
'price': 22.99
}
],
'bicycle': {
'color': 'red',
'price': 19.95
}
}
}
[docs] def test_bookstore_examples_1(self):
"""
Test the bookstore example 1.
.. code-block:: python
>>> expr = Path.parse_str('$.store.book[*].author')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$.store.book[*].author')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
for auth in ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']:
self.assertTrue(auth in matches)
[docs] def test_bookstore_examples_2(self):
"""
Test the bookstore example 2.
.. code-block:: python
>>> expr = Path.parse_str('$..author')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..author')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
for auth in ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']:
self.assertTrue(auth in matches)
[docs] def test_bookstore_examples_3(self):
"""
Test the bookstore example 3.
.. code-block:: python
>>> expr = Path.parse_str('$.store.*')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$.store.*')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertTrue(isinstance(matches[0], list))
self.assertTrue(isinstance(matches[1], dict))
self.assertEqual(matches[0][0]['author'], 'Nigel Rees')
self.assertEqual(matches[1]['color'], 'red')
[docs] def test_bookstore_examples_4(self):
"""
Test the bookstore example 4.
.. code-block:: python
>>> expr = Path.parse_str('$.store..price')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$.store..price')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
for price in [8.95, 12.99, 8.99, 22.99, 19.95]:
self.assertTrue(price in matches)
[docs] def test_bookstore_examples_5(self):
"""
Test the bookstore example 5.
.. code-block:: python
>>> expr = Path.parse_str('$..book[2]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[2]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'fiction')
self.assertEqual(matches[0]['author'], 'Herman Melville')
self.assertEqual(matches[0]['title'], 'Moby Dick')
self.assertEqual(matches[0]['isbn'], '0-553-21311-3')
self.assertEqual(matches[0]['price'], 8.99)
[docs] def test_bookstore_examples_6(self):
"""
Test the bookstore example 6.
.. code-block:: python
>>> expr = Path.parse_str('$..book[-1:]')
>>> expr.match(self.root_value)
>>> expr = Path.parse_str('$..book[-1]')
>>> expr.match(self.root_value)
>>> expr = Path.parse_str('$..book[3:4:1]')
>>> expr.match(self.root_value)
"""
for path in ['$..book[-1:]', '$..book[-1]', '$..book[3:4:1]']:
expr = Path.parse_str(path)
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'fiction')
self.assertEqual(matches[0]['author'], 'J. R. R. Tolkien')
self.assertEqual(matches[0]['title'], 'The Lord of the Rings')
self.assertEqual(matches[0]['isbn'], '0-395-19395-8')
self.assertEqual(matches[0]['price'], 22.99)
[docs] def test_bookstore_examples_7(self):
"""
Test the bookstore example 7.
.. code-block:: python
>>> expr = Path.parse_str('$..book[0,1]')
>>> expr.match(self.root_value)
>>> expr = Path.parse_str('$..book[:2]')
>>> expr.match(self.root_value)
>>> expr = Path.parse_str('$..book[:2:1]')
>>> expr.match(self.root_value)
"""
for path in ['$..book[0,1]', '$..book[:2]', '$..book[:2:1]']:
expr = Path.parse_str(path)
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'reference')
self.assertEqual(matches[0]['author'], 'Nigel Rees')
self.assertEqual(matches[0]['title'], 'Sayings of the Century')
self.assertEqual(matches[0]['price'], 8.95)
self.assertEqual(matches[1]['category'], 'fiction')
self.assertEqual(matches[1]['author'], 'Evelyn Waugh')
self.assertEqual(matches[1]['title'], 'Sword of Honour')
self.assertEqual(matches[1]['price'], 12.99)
[docs] def test_bookstore_examples_8(self):
"""
Test the bookstore example 8.
.. code-block:: python
>>> expr = Path.parse_str('$..book[*][?(@.isbn)]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[*][?(@.isbn)]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'fiction')
self.assertEqual(matches[0]['author'], 'Herman Melville')
self.assertEqual(matches[0]['title'], 'Moby Dick')
self.assertEqual(matches[0]['isbn'], '0-553-21311-3')
self.assertEqual(matches[0]['price'], 8.99)
self.assertEqual(matches[1]['category'], 'fiction')
self.assertEqual(matches[1]['author'], 'J. R. R. Tolkien')
self.assertEqual(matches[1]['title'], 'The Lord of the Rings')
self.assertEqual(matches[1]['isbn'], '0-395-19395-8')
self.assertEqual(matches[1]['price'], 22.99)
[docs] def test_bookstore_examples_9(self):
"""
Test the bookstore example 9.
.. code-block:: python
>>> expr = Path.parse_str('$..book[*][?(@.price<=10)]')
>>> expr.match(self.root_value)
>>> expr = Path.parse_str('$..book[*][?(@.price<10)]')
>>> expr.match(self.root_value)
"""
for path in ['$..book[*][?(@.price<10)]', '$..book[*][?(@.price<=10)]']:
expr = Path.parse_str(path)
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'reference')
self.assertEqual(matches[0]['author'], 'Nigel Rees')
self.assertEqual(matches[0]['title'], 'Sayings of the Century')
self.assertEqual(matches[0]['price'], 8.95)
self.assertEqual(matches[1]['category'], 'fiction')
self.assertEqual(matches[1]['author'], 'Herman Melville')
self.assertEqual(matches[1]['title'], 'Moby Dick')
self.assertEqual(matches[1]['isbn'], '0-553-21311-3')
self.assertEqual(matches[1]['price'], 8.99)
[docs] def test_bookstore_examples_10(self):
"""
Test the bookstore example 10.
.. code-block:: python
>>> expr = Path.parse_str('$..book[*][?(@.author = "Nigel Rees")]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[*][?(@.author = "Nigel Rees")]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'reference')
self.assertEqual(matches[0]['author'], 'Nigel Rees')
self.assertEqual(matches[0]['title'], 'Sayings of the Century')
self.assertEqual(matches[0]['price'], 8.95)
[docs] def test_bookstore_examples_11(self):
"""
Test the bookstore example 11.
.. code-block:: python
>>> expr = Path.parse_str('$..book[*][?(@.category != "fiction")]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[*][?(@.category != "fiction")]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'reference')
self.assertEqual(matches[0]['author'], 'Nigel Rees')
self.assertEqual(matches[0]['title'], 'Sayings of the Century')
self.assertEqual(matches[0]['price'], 8.95)
[docs] def test_bookstore_examples_12(self):
"""
Test the bookstore example 12.
.. code-block:: python
>>> expr = Path.parse_str('$..book[*][?(@.price>=10)]')
>>> expr.match(self.root_value)
>>> expr = Path.parse_str('$..book[*][?(@.price>10)]')
>>> expr.match(self.root_value)
"""
for path in ['$..book[*][?(@.price>10)]', '$..book[*][?(@.price>=10)]']:
expr = Path.parse_str(path)
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'fiction')
self.assertEqual(matches[0]['author'], 'Evelyn Waugh')
self.assertEqual(matches[0]['title'], 'Sword of Honour')
self.assertEqual(matches[0]['price'], 12.99)
self.assertEqual(matches[1]['category'], 'fiction')
self.assertEqual(matches[1]['author'], 'J. R. R. Tolkien')
self.assertEqual(matches[1]['title'], 'The Lord of the Rings')
self.assertEqual(matches[1]['isbn'], '0-395-19395-8')
self.assertEqual(matches[1]['price'], 22.99)
[docs]class TestExtendedBookStore(TestCase):
"""This test extends the standard bookstore test for completness."""
[docs] def setUp(self):
"""Copy the original bookstore document to this class."""
orig_bookstore = TestBookStore()
orig_bookstore.setUp()
self.root_value = orig_bookstore.root_value
[docs] def test_bookstore_extexample_1(self):
"""
Test the bookstore example with step function.
.. code-block:: python
>>> expr = Path.parse_str('$..book[::2]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[::2]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'reference')
self.assertEqual(matches[0]['author'], 'Nigel Rees')
self.assertEqual(matches[0]['title'], 'Sayings of the Century')
self.assertEqual(matches[0]['price'], 8.95)
self.assertEqual(matches[1]['category'], 'fiction')
self.assertEqual(matches[1]['author'], 'Herman Melville')
self.assertEqual(matches[1]['title'], 'Moby Dick')
self.assertEqual(matches[1]['isbn'], '0-553-21311-3')
self.assertEqual(matches[1]['price'], 8.99)
[docs] def test_bookstore_extexamples_2(self):
"""
Test the bookstore example slice with end and multiple colons.
.. code-block:: python
>>> expr = Path.parse_str('$..book[:2:]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[:2:]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(matches[0]['category'], 'reference')
self.assertEqual(matches[0]['author'], 'Nigel Rees')
self.assertEqual(matches[0]['title'], 'Sayings of the Century')
self.assertEqual(matches[0]['price'], 8.95)
self.assertEqual(matches[1]['category'], 'fiction')
self.assertEqual(matches[1]['author'], 'Evelyn Waugh')
self.assertEqual(matches[1]['title'], 'Sword of Honour')
self.assertEqual(matches[1]['price'], 12.99)
[docs] def test_bookstore_extexamples_3(self):
"""
Test the bookstore example slice with start and multiple colons.
.. code-block:: python
>>> expr = Path.parse_str('$..book[2::]')
>>> expr.match(self.root_value)
"""
expr = Path.parse_str('$..book[2::]')
self.assertEqual(Path.parse_str(str(expr)), expr)
matches = [x.current_value for x in expr.match(self.root_value)]
self.assertEqual(len(matches), 2)
self.assertEqual(matches[0]['category'], 'fiction')
self.assertEqual(matches[0]['author'], 'Herman Melville')
self.assertEqual(matches[0]['title'], 'Moby Dick')
self.assertEqual(matches[0]['isbn'], '0-553-21311-3')
self.assertEqual(matches[0]['price'], 8.99)