JSONPathArrayAccessTest.php 3.2 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
<?php
namespace Flow\JSONPath\Test;

use Flow\JSONPath\JSONPath;

require_once __DIR__ . "/../vendor/autoload.php";

class JSONPathArrayAccessTest extends \PHPUnit_Framework_TestCase
{
    public function testChaining()
    {
        $data = $this->exampleData(rand(0, 1));

        $conferences = (new JSONPath($data))->find('.conferences.*');
        $teams = $conferences->find('..teams.*');

        $this->assertEquals('Dodger', $teams[0]['name']);
        $this->assertEquals('Mets', $teams[1]['name']);

        $teams = (new JSONPath($data))->find('.conferences.*')->find('..teams.*');

        $this->assertEquals('Dodger', $teams[0]['name']);
        $this->assertEquals('Mets', $teams[1]['name']);

        $teams = (new JSONPath($data))->find('.conferences..teams.*');

        $this->assertEquals('Dodger', $teams[0]['name']);
        $this->assertEquals('Mets', $teams[1]['name']);
    }

    public function testIterating()
    {
        $data = $this->exampleData(rand(0, 1));

        $conferences = (new JSONPath($data))->find('.conferences.*');

        $names = [];

        foreach ($conferences as $conference) {
            $players = $conference->find('.teams.*.players[?(@.active=yes)]');

            foreach ($players as $player) {
                $names[] = $player->name;
            }
        }

        $this->assertEquals(['Joe Face', 'something'], $names);
    }

    public function testDifferentStylesOfAccess()
    {
        $data = $this->exampleData(rand(0, 1));

        $league = new JSONPath($data);

        $conferences = $league->conferences;
        $firstConference = $league->conferences[0];

        $this->assertEquals('Western Conference', $firstConference->name);
    }

    public function exampleData($asArray = true)
    {
        $data = [
            'name'        => 'Major League Baseball',
            'abbr'        => 'MLB',
            'conferences' => [
                [
                    'name'  => 'Western Conference',
                    'abbr'  => 'West',
                    'teams' => [
                        [
                            'name'     => 'Dodger',
                            'city'     => 'Los Angeles',
                            'whatever' => 'else',
                            'players'  => [
                                ['name' => 'Bob Smith', 'number' => 22],
                                ['name' => 'Joe Face', 'number' => 23, 'active' => 'yes'],
                            ],
                        ]
                    ],
                ],
                [
                    'name'  => 'Eastern Conference',
                    'abbr'  => 'East',
                    'teams' => [
                        [
                            'name'     => 'Mets',
                            'city'     => 'New York',
                            'whatever' => 'else',
                            'players'  => [
                                ['name' => 'something', 'number' => 14, 'active' => 'yes'],
                                ['name' => 'something', 'number' => 15],
                            ]
                        ]
                    ]
                ]
            ]
        ];

        return $asArray ? $data : json_decode(json_encode($data));

    }
}