diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fead064..987c1e3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php: ['8.1', '8.2', '8.3'] + php: ['7.4', '8.0', '8.1', '8.2', '8.3'] name: PHP ${{ matrix.php }} Tests @@ -36,14 +36,14 @@ jobs: uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: ${{ runner.os }}-composer- - name: Validate composer.json run: composer validate --strict - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-suggest + run: composer install --prefer-dist --no-progress --no-interaction - name: Run unit tests run: composer test:unit diff --git a/README.md b/README.md index f71ef82..04082fd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # FamilySearch PHP Lite SDK [![Packagist](https://img.shields.io/packagist/v/familysearch/fs-php-lite.svg)](https://packagist.org/packages/familysearch/fs-php-lite) -![Tests](https://github.com/PermanentOrg/fs-php-lite/workflows/Tests/badge.svg?branch=master) -[![PHP Version](https://img.shields.io/badge/php-8.1%20%7C%208.2%20%7C%208.3-blue.svg)](https://github.com/PermanentOrg/fs-php-lite) +![Tests](https://github.com/FamilySearch/fs-php-lite/workflows/Tests/badge.svg?branch=master) +[![PHP Version](https://img.shields.io/badge/php-7.4%20%7C%208.0%20%7C%208.1%20%7C%208.2%20%7C%208.3-blue.svg)](https://github.com/FamilySearch/fs-php-lite) Lite PHP SDK for the [FamilySearch API](https://familysearch.org/developers/). @@ -180,7 +180,7 @@ See [TESTING.md](TESTING.md) for detailed testing documentation. ## Requirements -- PHP 8.1 or higher +- PHP 7.4 or higher - ext-curl - ext-json @@ -197,7 +197,7 @@ See [TESTING.md](TESTING.md) for detailed testing documentation. ### CI/CD Tests run automatically via GitHub Actions on: -- PHP 8.1, 8.2, and 8.3 +- PHP 7.4, 8.0, 8.1, 8.2, and 8.3 - Every push and pull request - Code coverage reports generated for PHP 8.3 diff --git a/TESTING.md b/TESTING.md index 4fbf37d..33a5862 100644 --- a/TESTING.md +++ b/TESTING.md @@ -12,7 +12,7 @@ The SDK uses a multi-layered testing approach: ## Prerequisites -- PHP 8.1, 8.2, or 8.3 +- PHP 7.4, 8.0, 8.1, 8.2, or 8.3 - Composer - Xdebug (for code coverage) @@ -151,7 +151,7 @@ open coverage/index.html Tests run automatically on every push and pull request via GitHub Actions. The CI pipeline: -- Tests against PHP 8.1, 8.2, and 8.3 +- Tests against PHP 7.4, 8.0, 8.1, 8.2, and 8.3 - Runs both unit and integration tests - Generates code coverage reports (PHP 8.3 only) - Uploads coverage to Codecov @@ -310,19 +310,88 @@ composer test:integration ## PHP Version Testing -To test against specific PHP versions locally using Docker: +### Test All Supported PHP Versions Locally + +To verify compatibility across all supported PHP versions, use Docker with the script below. + +#### Quick Test (Single Version) ```bash +# PHP 7.4 +docker run --rm -v $(pwd):/app -w /app php:7.4-cli sh -c "apt-get update -qq && apt-get install -y -qq git zip unzip > /dev/null && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && composer install -q && composer test" + +# PHP 8.0 +docker run --rm -v $(pwd):/app -w /app php:8.0-cli sh -c "apt-get update -qq && apt-get install -y -qq git zip unzip > /dev/null && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && composer install -q && composer test" + # PHP 8.1 -docker run --rm -v $(pwd):/app -w /app php:8.1-cli composer test +docker run --rm -v $(pwd):/app -w /app php:8.1-cli sh -c "apt-get update -qq && apt-get install -y -qq git zip unzip > /dev/null && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && composer install -q && composer test" # PHP 8.2 -docker run --rm -v $(pwd):/app -w /app php:8.2-cli composer test +docker run --rm -v $(pwd):/app -w /app php:8.2-cli sh -c "apt-get update -qq && apt-get install -y -qq git zip unzip > /dev/null && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && composer install -q && composer test" # PHP 8.3 -docker run --rm -v $(pwd):/app -w /app php:8.3-cli composer test +docker run --rm -v $(pwd):/app -w /app php:8.3-cli sh -c "apt-get update -qq && apt-get install -y -qq git zip unzip > /dev/null && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && composer install -q && composer test" ``` +#### Test All Versions at Once + +Copy-paste this complete script to test all PHP versions in sequence: + +```bash +#!/bin/bash +# Test all supported PHP versions + +set -e + +VERSIONS=("7.4" "8.0" "8.1" "8.2" "8.3") + +echo "Testing fs-php-lite across PHP versions..." +echo "============================================" + +for VERSION in "${VERSIONS[@]}"; do + echo "" + echo "Testing PHP $VERSION..." + echo "------------------------" + + docker run --rm \ + -v $(pwd):/app \ + -w /app \ + php:${VERSION}-cli \ + sh -c " + apt-get update -qq && \ + apt-get install -y -qq git zip unzip > /dev/null && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && \ + echo 'Installing dependencies...' && \ + composer install -q && \ + echo 'Running tests...' && \ + composer test + " + + if [ $? -eq 0 ]; then + echo "✓ PHP $VERSION: PASSED" + else + echo "✗ PHP $VERSION: FAILED" + exit 1 + fi +done + +echo "" +echo "============================================" +echo "All PHP versions tested successfully!" +``` + +Save as `test-all-versions.sh`, make executable with `chmod +x test-all-versions.sh`, and run: + +```bash +./test-all-versions.sh +``` + +### Expected Behavior + +- **PHP 7.4**: Installs PHPUnit 9.x and php-vcr 1.7.x +- **PHP 8.0**: Installs PHPUnit 9.x or 10.x and php-vcr 1.7.x or 1.8.x +- **PHP 8.1+**: Installs PHPUnit 10.x and php-vcr 1.8.x + ## Contributing When submitting pull requests: diff --git a/composer.json b/composer.json index b799fc5..3e44713 100644 --- a/composer.json +++ b/composer.json @@ -11,14 +11,14 @@ ], "license": "Apache-2.0", "require": { - "php": ">=8.1", + "php": ">=7.4", "ext-curl": "*", "ext-json": "*" }, "require-dev": { "gedcomx/gedcomx-php": "^3.1.2", - "php-vcr/php-vcr": "^1.6", - "phpunit/phpunit": "^10.5", + "php-vcr/php-vcr": "^1.7", + "phpunit/phpunit": "^9.5 || ^10.5", "php-vcr/phpunit-testlistener-vcr": "^3.0" }, "autoload": { diff --git a/composer.lock b/composer.lock deleted file mode 100644 index a5cad78..0000000 --- a/composer.lock +++ /dev/null @@ -1,2356 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "1d0e53870429cb0d197fc24a8d08b459", - "packages": [], - "packages-dev": [ - { - "name": "beberlei/assert", - "version": "v3.3.3", - "source": { - "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/b5fd8eacd8915a1b627b8bfc027803f1939734dd", - "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": ">=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Assert/functions.php" - ], - "psr-4": { - "Assert\\": "lib/Assert" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", - "keywords": [ - "assert", - "assertion", - "validation" - ], - "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.3" - }, - "time": "2024-07-15T13:18:35+00:00" - }, - { - "name": "gedcomx/gedcomx-php", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/FamilySearch/gedcomx-php.git", - "reference": "f0b1ccb5d7110edd35765b48ff04f3b68b00e35c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FamilySearch/gedcomx-php/zipball/f0b1ccb5d7110edd35765b48ff04f3b68b00e35c", - "reference": "f0b1ccb5d7110edd35765b48ff04f3b68b00e35c", - "shasum": "" - }, - "require-dev": { - "fzaninotto/faker": "1.4.*", - "intervention/image": "2.0.*", - "phpunit/phpunit": "3.7.*", - "satooshi/php-coveralls": "dev-travis-fix" - }, - "type": "library", - "autoload": { - "psr-4": { - "Gedcomx\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "FamilySearch", - "homepage": "https://familysearch.org" - } - ], - "description": "PHP libraries for GEDCOM X.", - "homepage": "https://github.com/FamilySearch/gedcomx-php", - "keywords": [ - "familysearch", - "gedcomx", - "genealogy", - "sdk" - ], - "support": { - "issues": "https://github.com/FamilySearch/gedcomx-php/issues", - "source": "https://github.com/FamilySearch/gedcomx-php/tree/master" - }, - "time": "2016-11-17T18:39:31+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.13.4", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-08-01T08:46:24+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.7.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" - }, - "time": "2025-12-06T11:56:16+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "php-vcr/php-vcr", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/php-vcr/php-vcr.git", - "reference": "fbc88e02d4658eea255ce39c937c32937ae606f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-vcr/php-vcr/zipball/fbc88e02d4658eea255ce39c937c32937ae606f7", - "reference": "fbc88e02d4658eea255ce39c937c32937ae606f7", - "shasum": "" - }, - "require": { - "beberlei/assert": "^3.2.5", - "ext-curl": "*", - "php": "^8,<8.2|>=8.2.9,<8.6", - "symfony/event-dispatcher": "^4|^5|^6|^7", - "symfony/event-dispatcher-contracts": "^1|^2|^3", - "symfony/yaml": "^3|^4|^5|^6|^7" - }, - "require-dev": { - "editorconfig-checker/editorconfig-checker": "^10.3", - "ext-soap": "*", - "friendsofphp/php-cs-fixer": "^3.0", - "guzzlehttp/guzzle": "^7", - "mikey179/vfsstream": "^1.6.10", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1", - "phpstan/phpstan-beberlei-assert": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^9.5.10", - "thecodingmachine/phpstan-strict-rules": "^1" - }, - "type": "library", - "autoload": { - "psr-4": { - "VCR\\": "src/VCR/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Adrian Philipp", - "email": "mail@adrian-philipp.com" - } - ], - "description": "Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.", - "support": { - "issues": "https://github.com/php-vcr/php-vcr/issues", - "source": "https://github.com/php-vcr/php-vcr/tree/1.8.2" - }, - "time": "2025-12-30T08:17:19+00:00" - }, - { - "name": "php-vcr/phpunit-testlistener-vcr", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-vcr/phpunit-testlistener-vcr.git", - "reference": "e57a97f0c3942000350d03033d21e86ef48ac718" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-vcr/phpunit-testlistener-vcr/zipball/e57a97f0c3942000350d03033d21e86ef48ac718", - "reference": "e57a97f0c3942000350d03033d21e86ef48ac718", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0", - "php-vcr/php-vcr": "^1.4" - }, - "require-dev": { - "phpunit/phpunit": "^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "VCR\\PHPUnit\\TestListener\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Adrian Philipp", - "email": "mail@adrian-philipp.com" - } - ], - "description": "Integrates PHPUnit with PHP-VCR.", - "support": { - "issues": "https://github.com/php-vcr/phpunit-testlistener-vcr/issues", - "source": "https://github.com/php-vcr/phpunit-testlistener-vcr/tree/3.3.0" - }, - "time": "2024-10-29T19:16:02+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-22T04:31:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T06:24:48+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:56:09+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "10.5.63", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "33198268dad71e926626b618f3ec3966661e4d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", - "reference": "33198268dad71e926626b618f3ec3966661e4d90", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.5", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.4", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2026-01-27T05:48:37+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:59:15+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" - } - ], - "time": "2026-01-24T09:25:16+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:37:17+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:15:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0735b90f4da94969541dac1da743446e276defa6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", - "reference": "0735b90f4da94969541dac1da743446e276defa6", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", - "type": "tidelift" - } - ], - "time": "2025-09-24T06:09:11+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:19:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:38:20+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:08:32+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:06:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" - } - ], - "time": "2025-08-10T07:50:56+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:10:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", - "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.7-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-04-13T15:52:40+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v7.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e4a2e29753c7801f7a8340e066cfa788f3bc8101", - "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/error-handler": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.9" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-04-18T13:18:21+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.7.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", - "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-01-05T13:30:16+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "141046a8f9477948ff284fa65be2095baafb94f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", - "reference": "141046a8f9477948ff284fa65be2095baafb94f2", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-04-10T16:19:22+00:00" - }, - { - "name": "symfony/yaml", - "version": "v7.4.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e2eb64a57763815ccae07ac1c7653d6cc1c326fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e2eb64a57763815ccae07ac1c7653d6cc1c326fd", - "reference": "e2eb64a57763815ccae07ac1c7653d6cc1c326fd", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.11" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-05-13T12:04:42+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2025-11-17T20:03:58+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8.1", - "ext-curl": "*", - "ext-json": "*" - }, - "platform-dev": {}, - "plugin-api-version": "2.9.0" -} diff --git a/phpunit.xml b/phpunit.xml index 3043fef..a927b66 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -4,7 +4,6 @@ bootstrap="tests/bootstrap.php" colors="true" cacheDirectory=".phpunit.cache" - displayDetailsOnTestsThatTriggerWarnings="true" failOnWarning="true" failOnRisky="true"> diff --git a/test-all-versions.sh b/test-all-versions.sh new file mode 100755 index 0000000..769adff --- /dev/null +++ b/test-all-versions.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# Test all supported PHP versions for fs-php-lite +# This script runs tests in Docker containers to verify compatibility + +set -e + +VERSIONS=("7.4" "8.0" "8.1" "8.2" "8.3") +FAILED_VERSIONS=() + +echo "Testing fs-php-lite across PHP versions..." +echo "============================================" + +for VERSION in "${VERSIONS[@]}"; do + echo "" + echo "Testing PHP $VERSION..." + echo "------------------------" + + if docker run --rm \ + -v $(pwd):/app \ + -w /app \ + php:${VERSION}-cli \ + sh -c " + apt-get update -qq && \ + apt-get install -y -qq git zip unzip > /dev/null && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer > /dev/null && \ + echo '✓ Composer installed' && \ + composer install -q && \ + echo '✓ Dependencies installed' && \ + php -v | head -1 && \ + vendor/bin/phpunit --version && \ + composer test + "; then + echo "✓ PHP $VERSION: PASSED" + else + echo "✗ PHP $VERSION: FAILED" + FAILED_VERSIONS+=("$VERSION") + fi +done + +echo "" +echo "============================================" + +if [ ${#FAILED_VERSIONS[@]} -eq 0 ]; then + echo "✓ All PHP versions tested successfully!" + exit 0 +else + echo "✗ Failed versions: ${FAILED_VERSIONS[*]}" + exit 1 +fi diff --git a/tests/Integration/ApiTestCase.php b/tests/Integration/ApiTestCase.php index b164f06..5c875b8 100644 --- a/tests/Integration/ApiTestCase.php +++ b/tests/Integration/ApiTestCase.php @@ -9,6 +9,7 @@ abstract class ApiTestCase extends TestCase { protected FamilySearch $client; private static ?array $personData = null; + private bool $vcrEnabled = false; /** * Get credentials from environment or SandboxCredentials class @@ -51,12 +52,58 @@ protected function hasCredentials(): bool */ protected function setUp(): void { + // Start VCR if test has @vcr annotation + $annotations = $this->getAnnotationsForTest(); + if (isset($annotations['vcr'])) { + $cassetteName = $annotations['vcr'][0]; + + // Ensure VCR is properly configured before turning on + \VCR\VCR::configure()->setMode('once'); + \VCR\VCR::configure()->setCassettePath('tests/fixtures'); + \VCR\VCR::configure()->enableRequestMatchers(array('method','url','body')); + \VCR\VCR::configure()->enableLibraryHooks(array('curl')); + + \VCR\VCR::turnOn(); + \VCR\VCR::insertCassette($cassetteName); + $this->vcrEnabled = true; + } + $creds = $this->getCredentials(); $this->client = new FamilySearch([ 'appKey' => $creds['api_key'] ]); } + /** + * Automatically called by PHPUnit after each test is run + */ + protected function tearDown(): void + { + if ($this->vcrEnabled) { + \VCR\VCR::eject(); + \VCR\VCR::turnOff(); + $this->vcrEnabled = false; + } + } + + /** + * Get annotations for the current test method + */ + private function getAnnotationsForTest(): array + { + $annotations = []; + try { + $method = new \ReflectionMethod($this, $this->nameWithDataSet()); + $docComment = $method->getDocComment(); + if ($docComment && preg_match('/@vcr\s+(\S+)/', $docComment, $matches)) { + $annotations['vcr'] = [$matches[1]]; + } + } catch (\Exception $e) { + // If we can't get annotations, just continue without VCR + } + return $annotations; + } + /** * Authenticate with sandbox via the OAuth2 password flow */ diff --git a/tests/Integration/FamilySearchIntegrationTest.php b/tests/Integration/FamilySearchIntegrationTest.php index 90f1d70..b023ca7 100644 --- a/tests/Integration/FamilySearchIntegrationTest.php +++ b/tests/Integration/FamilySearchIntegrationTest.php @@ -2,8 +2,6 @@ namespace FamilySearch\Tests\Integration; -use VCR\VCR; - /** * Integration tests using VCR for HTTP recording/replay */ @@ -14,17 +12,11 @@ class FamilySearchIntegrationTest extends ApiTestCase */ public function testAuthenticate(): void { - VCR::turnOn(); - VCR::insertCassette('testAuthenticate.json'); - $response = $this->login(); $this->assertResponseOK($response); $this->assertResponseData($response); $this->assertArrayHasKey('access_token', $response->data); - - VCR::eject(); - VCR::turnOff(); } /** @@ -32,9 +24,6 @@ public function testAuthenticate(): void */ public function testPost(): void { - VCR::turnOn(); - VCR::insertCassette('testPost.json'); - $this->assertResponseOK($this->login()); $personId = $this->createPerson(); @@ -43,9 +32,6 @@ public function testPost(): void 'createPerson() returned null - VCR cassette may not properly replay X-ENTITY-ID header' ); $this->assertNotEmpty($personId); - - VCR::eject(); - VCR::turnOff(); } /** @@ -53,9 +39,6 @@ public function testPost(): void */ public function testGet(): void { - VCR::turnOn(); - VCR::insertCassette('testGet.json'); - $this->assertResponseOK($this->login()); $personId = $this->createPerson(); @@ -67,9 +50,6 @@ public function testGet(): void $response = $this->client->get('/platform/tree/persons/' . $personId); $this->assertResponseOK($response); $this->assertResponseData($response); - - VCR::eject(); - VCR::turnOff(); } /** @@ -77,9 +57,6 @@ public function testGet(): void */ public function testHead(): void { - VCR::turnOn(); - VCR::insertCassette('testHead.json'); - $this->assertResponseOK($this->login()); $personId = $this->createPerson(); @@ -92,9 +69,6 @@ public function testHead(): void $this->assertResponseOK($response); $this->assertEmpty($response->body); $this->assertEmpty($response->data ?? null); - - VCR::eject(); - VCR::turnOff(); } /** @@ -102,9 +76,6 @@ public function testHead(): void */ public function testDelete(): void { - VCR::turnOn(); - VCR::insertCassette('testDelete.json'); - $this->assertResponseOK($this->login()); $personId = $this->createPerson(); @@ -118,9 +89,6 @@ public function testDelete(): void $response = $this->client->get('/platform/tree/persons/' . $personId); $this->assertEquals(410, $response->statusCode); - - VCR::eject(); - VCR::turnOff(); } /** @@ -149,18 +117,12 @@ public function testRedirect(): void 'Redirect functionality is verified via testPendingModification and manual testing.' ); - VCR::turnOn(); - VCR::insertCassette('testRedirect.json'); - $this->assertResponseOK($this->login()); $response = $this->client->get('/platform/tree/current-person'); $this->assertTrue($response->redirected); $this->assertEquals('https://api-integ.familysearch.org/platform/tree/current-person', $response->originalUrl); $this->assertEquals('https://api-integ.familysearch.org/platform/tree/persons/KW7G-28J', $response->effectiveUrl); - - VCR::eject(); - VCR::turnOff(); } /** @@ -190,9 +152,6 @@ public function testPendingModification(): void 'Pending modification functionality is verified via manual testing.' ); - VCR::turnOn(); - VCR::insertCassette('testPendingModification.json'); - $creds = $this->getCredentials(); $this->client = new \FamilySearch([ 'appKey' => $creds['api_key'], @@ -211,9 +170,6 @@ public function testPendingModification(): void $this->assertResponseOK($response); $this->assertResponseData($response); $this->assertTrue($response->redirected); - - VCR::eject(); - VCR::turnOff(); } /** @@ -221,9 +177,6 @@ public function testPendingModification(): void */ public function testUserAgent(): void { - VCR::turnOn(); - VCR::insertCassette('testUserAgent.json'); - $creds = $this->getCredentials(); $this->client = new \FamilySearch([ 'appKey' => $creds['api_key'], @@ -239,8 +192,5 @@ public function testUserAgent(): void $this->assertStringContainsString('curl', $response->requestHeaders['User-Agent']); $this->assertStringContainsString('PHP', $response->requestHeaders['User-Agent']); $this->assertStringContainsString('myApp/1.2.3', $response->requestHeaders['User-Agent']); - - VCR::eject(); - VCR::turnOff(); } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 8d39691..f438d44 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -6,15 +6,8 @@ require __DIR__ . '/../vendor/autoload.php'; // Configure VCR for integration tests -\VCR\VCR::configure()->addRequestMatcher('custom_headers', function(\VCR\Request $first, \VCR\Request $second){ - $firstHeaders = $first->getHeaders(); - $secondHeaders = $second->getHeaders(); - unset($firstHeaders['User-Agent']); - unset($secondHeaders['User-Agent']); - return count(array_diff_assoc($firstHeaders, $secondHeaders)) === 0; -}); - -\VCR\VCR::configure()->enableRequestMatchers(array('method','url','query_string','body','custom_headers')); +// Only match on method, url, and body (not headers since User-Agent varies) +\VCR\VCR::configure()->enableRequestMatchers(array('method','url','body')); \VCR\VCR::configure()->setMode('once'); \VCR\VCR::configure()->setCassettePath('tests/fixtures'); \VCR\VCR::configure()->setBlackList(['vendor']); diff --git a/tests/fixtures/testAuthenticate.json b/tests/fixtures/testAuthenticate.json index b823292..2a9e010 100644 --- a/tests/fixtures/testAuthenticate.json +++ b/tests/fixtures/testAuthenticate.json @@ -29,4 +29,83 @@ }, "body": "{\"access_token\":\"USYS6BD43FA8AE0867B68B90C5E59D6A40B0_idses-int02.a.fsglobal.net\",\"token_type\":\"family_search\",\"token\":\"USYS6BD43FA8AE0867B68B90C5E59D6A40B0_idses-int02.a.fsglobal.net\"}" } -}] \ No newline at end of file +} +- + request: + method: POST + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + headers: + Host: integration.familysearch.org + content-type: application/x-www-form-urlencoded + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + body: 'grant_type=password&client_id=a02j000000CBv4gAAD&username=sdktester&password=1234sdkpass' + response: + status: + code: 200 + message: '' + headers: + content-type: application/json;charset=UTF-8 + date: 'Thu, 18 Jun 2026 01:11:56 GMT' + server: nginx + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + cache-control: no-store + content-language: en-US + via: '1.1 d08613e1dd8ad614e47875ae31a8af20.cloudfront.net (CloudFront)' + content-security-policy: "frame-ancestors 'self' https://*.familysearch.org https://*.familysearch.psdops.com https://*.church.brightspot.cloud http://localhost:* " + x-frame-options: SAMEORIGIN + x-cache: 'Miss from cloudfront' + x-amz-cf-pop: SEA900-P1 + x-amz-cf-id: ktXDae25z6prix31LtKaDceAw7_H3Wsx7BgySE4-mPTmWnC0v7rDLg== + set-cookie: ['visid_incap_2846689=v65XVUQvR1yGcZNdnfAokNxFM2oAAAAAQUIPAAAAAADZFo04XoN9nbkHohlzEZtm; expires=Thu, 17 Jun 2027 06:53:04 GMT; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'nlbi_2846689=vRMCDAbFWxy0U3QgNegyBwAAAAAiqdSP2gkC/9jNbvVzP6SN; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'incap_ses_2107_2846689=9lvkdrI4HV1Z2vI965E9HdxFM2oAAAAAz2fQ5ayxXmj5Bq34CUN1ug==; path=/; Domain=.familysearch.org; Secure; SameSite=None'] + strict-transport-security: 'max-age=31536000; includeSubDomains' + x-cdn: Imperva + x-iinfo: '16-54402366-54402371 NNNN CT(1 3 0) RT(1781745116382 27) q(0 0 0 1) r(6 6) U24' + body: '{"access_token":"i0-BdS4SMN7twv.q0UyPYJ~O1c","token_type":"family_search","token":"i0-BdS4SMN7twv.q0UyPYJ~O1c"}' + curl_info: + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + content_type: application/json;charset=UTF-8 + http_code: 200 + header_size: 1301 + request_size: 299 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.766318 + namelookup_time: 0.12336 + connect_time: 0.146401 + pretransfer_time: 0.170358 + size_upload: 88.0 + size_download: 111.0 + speed_download: 144.0 + speed_upload: 114.0 + download_content_length: -1.0 + upload_content_length: 88.0 + starttransfer_time: 0.766262 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 45.223.160.251 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53048 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 170274 + queue_time_us: 55 + connect_time_us: 146401 + namelookup_time_us: 123360 + pretransfer_time_us: 170358 + redirect_time_us: 0 + starttransfer_time_us: 766262 + posttransfer_time_us: 170357 + total_time_us: 766318 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 diff --git a/tests/fixtures/testDelete.json b/tests/fixtures/testDelete.json index 99bcb58..1c7e4d7 100644 --- a/tests/fixtures/testDelete.json +++ b/tests/fixtures/testDelete.json @@ -128,4 +128,300 @@ }, "body": "{\n \"links\" : {\n \"alternate\" : [ {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/tree\/person\/L5F4-3NK\/details\"\n } ]\n },\n \"description\" : \"#SD-L5F4-3NK\",\n \"persons\" : [ {\n \"id\" : \"L5F4-3NK\",\n \"living\" : false,\n \"gender\" : {\n \"id\" : \"03faf2c1-8613-499e-9c37-8d610f9cf83c\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094758922\n },\n \"type\" : \"http:\/\/gedcomx.org\/Male\",\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/conclusions\/03faf2c1-8613-499e-9c37-8d610f9cf83c\"\n }\n }\n },\n \"links\" : {\n \"parent-relationships\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/parent-relationships\"\n },\n \"spouses\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/spouses\"\n },\n \"change-history\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/changes\"\n },\n \"ancestry\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/ancestry?person=L5F4-3NK\"\n },\n \"notes\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/notes\"\n },\n \"non-matches\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/not-a-match\"\n },\n \"restore\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/restore\"\n },\n \"portraits\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/portraits\"\n },\n \"ordinances\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/ordinances\"\n },\n \"collection\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/collections\/tree\"\n },\n \"families\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/families\"\n },\n \"portrait\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/portrait\"\n },\n \"matches\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/matches\"\n },\n \"child-relationships\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/child-relationships\"\n },\n \"children\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/children\"\n },\n \"descendancy\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/descendancy?person=L5F4-3NK\"\n },\n \"person\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\"\n },\n \"source-descriptions\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/sources\"\n },\n \"merge\" : {\n \"template\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/{pid}\/merges\/{dpid}{?access_token,filter}\",\n \"type\" : \"application\/json,application\/x-fs-v1+json,application\/x-fs-v1+xml,application\/xml,text\/html\",\n \"accept\" : \"application\/x-fs-v1+json,application\/x-fs-v1+xml\",\n \"allow\" : \"OPTIONS,GET,POST\",\n \"title\" : \"Person Merge\"\n },\n \"spouse-relationships\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/spouse-relationships\"\n },\n \"ordinance-reservations\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/reservations\"\n },\n \"artifacts\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/memories\"\n },\n \"parents\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/parents\"\n }\n },\n \"identifiers\" : {\n \"http:\/\/gedcomx.org\/Persistent\" : [ \"https:\/\/integration.familysearch.org\/ark:\/61903\/4:1:L5F4-3NK\" ]\n },\n \"names\" : [ {\n \"id\" : \"e4650585-c73b-4b03-b2bf-df581bcf744f\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094758922\n },\n \"type\" : \"http:\/\/gedcomx.org\/BirthName\",\n \"preferred\" : true,\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/conclusions\/e4650585-c73b-4b03-b2bf-df581bcf744f\"\n }\n },\n \"nameForms\" : [ {\n \"lang\" : \"en\",\n \"fullText\" : \"Ebenezer Clark\",\n \"parts\" : [ {\n \"type\" : \"http:\/\/gedcomx.org\/Given\",\n \"value\" : \"Ebenezer\"\n }, {\n \"type\" : \"http:\/\/gedcomx.org\/Surname\",\n \"value\" : \"Clark\"\n } ],\n \"nameFormInfo\" : [ {\n \"order\" : \"http:\/\/familysearch.org\/v1\/Eurotypic\"\n } ]\n } ]\n } ],\n \"facts\" : [ {\n \"id\" : \"144275f8-57bf-4baa-956e-a8608e702d3b\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094758922\n },\n \"type\" : \"http:\/\/gedcomx.org\/Birth\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n }, {\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/conclusions\/144275f8-57bf-4baa-956e-a8608e702d3b\"\n }\n }\n }, {\n \"id\" : \"56d82696-5744-4b83-bf12-e087f05a446e\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094758922\n },\n \"type\" : \"http:\/\/gedcomx.org\/Death\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n }, {\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/conclusions\/56d82696-5744-4b83-bf12-e087f05a446e\"\n }\n }\n }, {\n \"id\" : \"c517606c-a0b6-4bc6-98bc-4134d88a1bdf\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094758922\n },\n \"type\" : \"http:\/\/gedcomx.org\/Christening\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n }, {\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/conclusions\/c517606c-a0b6-4bc6-98bc-4134d88a1bdf\"\n }\n }\n }, {\n \"id\" : \"62838e2d-b3b7-4815-9e0d-8bb1556439e5\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094758922\n },\n \"type\" : \"http:\/\/gedcomx.org\/Burial\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n }, {\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-3NK\/conclusions\/62838e2d-b3b7-4815-9e0d-8bb1556439e5\"\n }\n }\n } ],\n \"display\" : {\n \"name\" : \"Ebenezer Clark\",\n \"gender\" : \"Male\",\n \"lifespan\" : \"1651-1721\",\n \"birthDate\" : \"29 November 1651\",\n \"birthPlace\" : \"New Haven, New Haven, Connecticut, United States\",\n \"deathDate\" : \"1721\",\n \"deathPlace\" : \"Wallingford, New Haven, Connecticut, United States\"\n }\n } ],\n \"sourceDescriptions\" : [ {\n \"id\" : \"SD-L5F4-3NK\",\n \"about\" : \"#L5F4-3NK\",\n \"componentOf\" : {\n \"description\" : \"https:\/\/api-integ.familysearch.org\/platform\/collections\/tree\"\n },\n \"resourceType\" : \"http:\/\/gedcomx.org\/Person\",\n \"version\" : \"137323875594460000\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/sources\/descriptions\/SD-L5F4-3NK\"\n }\n },\n \"citations\" : [ {\n \"lang\" : \"en\",\n \"value\" : \"\\\"Family Tree,\\\" database, FamilySearch<\/i> (http:\/\/familysearch.org), entry for Ebenezer Clark(PID https:\/\/integration.familysearch.org\/ark:\/61903\/4:1:L5F4-3NK); contributed by various users.\"\n } ],\n \"titles\" : [ {\n \"value\" : \"Ebenezer Clark\"\n } ],\n \"identifiers\" : {\n \"http:\/\/gedcomx.org\/Persistent\" : [ \"https:\/\/integration.familysearch.org\/ark:\/61903\/4:1:L5F4-3NK\" ]\n }\n } ],\n \"places\" : [ {\n \"id\" : \"3779514\",\n \"latitude\" : 41.31,\n \"longitude\" : -72.92417,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n }, {\n \"id\" : \"3779369\",\n \"latitude\" : 41.456389,\n \"longitude\" : -72.80472,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n } ]\n}" } -}] \ No newline at end of file +} +- + request: + method: POST + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + headers: + Host: integration.familysearch.org + content-type: application/x-www-form-urlencoded + Authorization: 'Bearer i0-7ANgAORfIMh.WiaMK_jMH19' + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + body: 'grant_type=password&client_id=a02j000000CBv4gAAD&username=sdktester&password=1234sdkpass' + response: + status: + code: 200 + message: '' + headers: + content-type: application/json;charset=UTF-8 + content-length: '111' + date: 'Thu, 18 Jun 2026 01:12:03 GMT' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + cache-control: no-store + content-language: en-US + server: nginx + via: '1.1 b7d7903ada432685f0e90f0ca261d864.cloudfront.net (CloudFront)' + content-security-policy: "frame-ancestors 'self' https://*.familysearch.org https://*.familysearch.psdops.com https://*.church.brightspot.cloud http://localhost:* " + x-frame-options: SAMEORIGIN + x-cache: 'Miss from cloudfront' + x-amz-cf-pop: SEA900-P1 + x-amz-cf-id: cruwQx0jHvcuiI5tXBe775TNJc3u6XxVoeul_Z7hcvtuCUSgSOFDQQ== + set-cookie: ['visid_incap_2846689=v65XVUQvR1yGcZNdnfAokNxFM2oAAAAAQUIPAAAAAADZFo04XoN9nbkHohlzEZtm; expires=Thu, 17 Jun 2027 06:52:57 GMT; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'nlbi_2846689=YznlUP5uInZWw6ENNegyBwAAAACwFWeV1F8i9FJ5Tzt4Jq7/; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'incap_ses_2107_2846689=1FiLVdXmNE5Z2vI965E9HeNFM2oAAAAAUAsc+M/wPYafjxtaxHgbeg==; path=/; Domain=.familysearch.org; Secure; SameSite=None'] + strict-transport-security: 'max-age=31536000; includeSubDomains' + x-cdn: Imperva + x-iinfo: '15-48543955-48543960 NNNN CT(1 6 0) RT(1781745122497 27) q(0 0 0 0) r(6 6) U24' + body: '{"access_token":"i0-zHo~LWnPy0_.63BYzqFDMcZ","token_type":"family_search","token":"i0-zHo~LWnPy0_.63BYzqFDMcZ"}' + curl_info: + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + content_type: application/json;charset=UTF-8 + http_code: 200 + header_size: 1322 + request_size: 349 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.691614 + namelookup_time: 0.006019 + connect_time: 0.103091 + pretransfer_time: 0.129687 + size_upload: 88.0 + size_download: 111.0 + speed_download: 160.0 + speed_upload: 127.0 + download_content_length: 111.0 + upload_content_length: 88.0 + starttransfer_time: 0.691454 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 45.223.160.251 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53060 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 129602 + queue_time_us: 22 + connect_time_us: 103091 + namelookup_time_us: 6019 + pretransfer_time_us: 129687 + redirect_time_us: 0 + starttransfer_time_us: 691454 + posttransfer_time_us: 129685 + total_time_us: 691614 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: POST + url: 'https://api-integ.familysearch.org/platform/tree/persons' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-zHo~LWnPy0_.63BYzqFDMcZ' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + content-type: application/x-fs-v1+json + body: '{"persons":[{"sources":[{"id":"34077598-142f-4784-b1e7-329e2b5a0625","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/34077598-142f-4784-b1e7-329e2b5a0625"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770475882},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},{"id":"c290dcce-f7eb-447b-8122-c03ae16f9b96","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/c290dcce-f7eb-447b-8122-c03ae16f9b96"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770441164},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"}],"sortKey":"0000000000","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"living":false,"gender":{"id":"8b165ed0-5377-4c55-b4c5-1d6407166e3f","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8b165ed0-5377-4c55-b4c5-1d6407166e3f"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Male"},"names":[{"id":"54910b54-274d-461c-adda-7190479bc4c7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/54910b54-274d-461c-adda-7190479bc4c7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/BirthName","nameForms":[{"fullText":"Ebenezer Clark","parts":[{"type":"http:\/\/gedcomx.org\/Given","value":"Ebenezer"},{"type":"http:\/\/gedcomx.org\/Surname","value":"Clark"}]}],"preferred":true}],"facts":[{"id":"99519cb9-a8bf-4914-9f11-ccf93492b48b","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/99519cb9-a8bf-4914-9f11-ccf93492b48b"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Birth","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}},{"id":"8e9dd699-4cea-4d30-8ff2-d5d11b171937","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8e9dd699-4cea-4d30-8ff2-d5d11b171937"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Death","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"80c2512c-d2bc-422c-a0b8-66fb4621c2f7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/80c2512c-d2bc-422c-a0b8-66fb4621c2f7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Burial","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"c36105fd-4502-4a35-867c-308623e24299","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/c36105fd-4502-4a35-867c-308623e24299"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Christening","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}}]}],"sourceDescriptions":[{"id":"SD-L5C2-WYC","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/SD-L5C2-WYC"}},"citations":[{"lang":"en","value":"\"Family Tree,\" database, FamilySearch<\/i> (http:\/\/familysearch.org : modified 09 August 2016, 19:21), entry for Ebenezer Clark(PID https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC); contributed by various users."}],"about":"#L5C2-WYC","componentOf":{"description":"https:\/\/sandbox.familysearch.org\/platform\/collections\/tree"},"titles":[{"value":"Ebenezer Clark"}],"resourceType":"http:\/\/gedcomx.org\/Person","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"modified":1470770475000,"version":"136900632758820000"}]}' + response: + status: + code: 201 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:03 GMT' + content-length: '0' + location: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1' + cache-control: 'no-cache, no-store, max-age=0, must-revalidate' + link: ['; rel="ancestry"', '; rel="descendancy"', '; rel="matches"', '; rel="notes"', '; rel="persons"'] + server: nginx + vary: 'Accept,Accept-Language,Accept-Encoding,Expect' + warning: ['400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '199 FamilySearch "Too many warnings..."'] + x-entity-id: LYXJ-QZ1 + x-processing-time: '327' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons' + content_type: null + http_code: 201 + header_size: 2347 + request_size: 6722 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.59082 + namelookup_time: 0.006973 + connect_time: 0.068325 + pretransfer_time: 0.193959 + size_upload: 6451.0 + size_download: 0.0 + speed_download: 0.0 + speed_upload: 10918.0 + download_content_length: 0.0 + upload_content_length: 6451.0 + starttransfer_time: 0.590706 + redirect_time: 0.0 + redirect_url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53061 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 193819 + queue_time_us: 45 + connect_time_us: 68325 + namelookup_time_us: 6973 + pretransfer_time_us: 193959 + redirect_time_us: 0 + starttransfer_time_us: 590706 + posttransfer_time_us: 193958 + total_time_us: 590820 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: DELETE + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-zHo~LWnPy0_.63BYzqFDMcZ' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + response: + status: + code: 204 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:04 GMT' + cache-control: 'max-age=0, must-revalidate, no-transform' + server: nginx + vary: 'Accept,Accept-Language,Accept-Encoding,Expect' + x-processing-time: '138' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1' + content_type: null + http_code: 204 + header_size: 283 + request_size: 220 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.388582 + namelookup_time: 0.008384 + connect_time: 0.068333 + pretransfer_time: 0.188048 + size_upload: 0.0 + size_download: 0.0 + speed_download: 0.0 + speed_upload: 0.0 + download_content_length: 0.0 + upload_content_length: 0.0 + starttransfer_time: 0.388546 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53062 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 187873 + queue_time_us: 27 + connect_time_us: 68333 + namelookup_time_us: 8384 + pretransfer_time_us: 188048 + redirect_time_us: 0 + starttransfer_time_us: 388546 + posttransfer_time_us: 188047 + total_time_us: 388582 + effective_method: DELETE + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: GET + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-zHo~LWnPy0_.63BYzqFDMcZ' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + response: + status: + code: 410 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:04 GMT' + content-type: application/x-fs-v1+json + cache-control: 'max-age=0, must-revalidate, no-transform' + content-location: /tree/persons/LYXJ-QZ1 + server: nginx + vary: 'accept,accept-language,accept-encoding,expect' + warning: '400 FamilySearch "Failure in upstream call: Unable to read Person (upstream 410)"' + x-processing-time: '32' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + body: "{\n \"description\" : \"#SD_PERSON_LYXJ-QZ1\",\n \"persons\" : [ {\n \"id\" : \"LYXJ-QZ1\",\n \"sortKey\" : \"0000000000\",\n \"living\" : false,\n \"gender\" : {\n \"id\" : \"f7f3a4f6-0c17-4615-b29f-cf1bf62f0440\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745123521\n },\n \"type\" : \"http://gedcomx.org/Male\",\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/conclusions/f7f3a4f6-0c17-4615-b29f-cf1bf62f0440?flag=fsh\"\n }\n }\n },\n \"links\" : {\n \"spouses\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/spouses?flag=fsh\"\n },\n \"change-history\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/changes?flag=fsh\"\n },\n \"ancestry\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/ancestry?flag=fsh&person=LYXJ-QZ1\"\n },\n \"notes\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/notes?flag=fsh\"\n },\n \"non-matches\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/not-a-match?flag=fsh\"\n },\n \"restore\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/restore?flag=fsh\"\n },\n \"portraits\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/portraits?flag=fsh\"\n },\n \"collection\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/collections/tree?flag=fsh\"\n },\n \"families\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/families?flag=fsh\"\n },\n \"portrait\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/portrait?flag=fsh\"\n },\n \"matches\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/matches?flag=fsh\"\n },\n \"children\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/children?flag=fsh\"\n },\n \"descendancy\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/descendancy?flag=fsh&person=LYXJ-QZ1\"\n },\n \"person\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1?flag=fsh\"\n },\n \"source-descriptions\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/sources?flag=fsh\"\n },\n \"merge\" : {\n \"template\" : \"https://api-integ.familysearch.org/platform/tree/persons/{pid}/merges/{dpid}?flag=fst{&filter,access_token}\",\n \"type\" : \"application/json,application/x-fs-v1+json,application/x-fs-v1+xml,application/xml,text/html\",\n \"accept\" : \"*/*\",\n \"allow\" : \"GET,OPTIONS,POST\",\n \"title\" : \"Person Merge\"\n },\n \"artifacts\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/memories?flag=fsh\"\n },\n \"parents\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/parents?flag=fsh\"\n }\n },\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://integration.familysearch.org/ark:/61903/4:1:LYXJ-QZ1\" ]\n },\n \"names\" : [ {\n \"id\" : \"e2684e49-a299-4da8-b5a7-1b03dbf733b4\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745123521\n },\n \"type\" : \"http://gedcomx.org/BirthName\",\n \"preferred\" : true,\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/conclusions/e2684e49-a299-4da8-b5a7-1b03dbf733b4?flag=fsh\"\n }\n },\n \"nameForms\" : [ {\n \"lang\" : \"en\",\n \"fullText\" : \"Ebenezer Clark\",\n \"parts\" : [ {\n \"type\" : \"http://gedcomx.org/Given\",\n \"value\" : \"Ebenezer\"\n }, {\n \"type\" : \"http://gedcomx.org/Surname\",\n \"value\" : \"Clark\"\n } ],\n \"nameFormInfo\" : [ {\n \"order\" : \"http://familysearch.org/v1/Eurotypic\"\n } ]\n } ]\n } ],\n \"facts\" : [ {\n \"id\" : \"31bc5023-7322-477e-9da2-d302192eaecc\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745123521\n },\n \"type\" : \"http://gedcomx.org/Birth\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/conclusions/31bc5023-7322-477e-9da2-d302192eaecc?flag=fsh\"\n }\n }\n }, {\n \"id\" : \"db0ed1fe-e5b8-472c-9db9-ef1ee7389422\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745123521\n },\n \"type\" : \"http://gedcomx.org/Death\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/conclusions/db0ed1fe-e5b8-472c-9db9-ef1ee7389422?flag=fsh\"\n }\n }\n }, {\n \"id\" : \"483731e7-1ce3-4bfa-98c0-14891540b5bc\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745123521\n },\n \"type\" : \"http://gedcomx.org/Christening\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/conclusions/483731e7-1ce3-4bfa-98c0-14891540b5bc?flag=fsh\"\n }\n }\n }, {\n \"id\" : \"bec69aff-5edb-49e7-b7fb-70e88b84ae95\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745123521\n },\n \"type\" : \"http://gedcomx.org/Burial\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1/conclusions/bec69aff-5edb-49e7-b7fb-70e88b84ae95?flag=fsh\"\n }\n }\n } ],\n \"display\" : {\n \"name\" : \"Ebenezer Clark\",\n \"gender\" : \"Male\",\n \"lifespan\" : \"1651-1721\",\n \"birthDate\" : \"29 November 1651\",\n \"birthPlace\" : \"New Haven, New Haven, Connecticut, United States\",\n \"deathDate\" : \"1721\",\n \"deathPlace\" : \"Wallingford, New Haven, Connecticut, United States\",\n \"ascendancyNumber\" : \"1\",\n \"descendancyNumber\" : \"1\"\n },\n \"personInfo\" : [ {\n \"canUserEdit\" : true,\n \"visibleToAll\" : true,\n \"visibleToAllWhenUsingFamilySearchApps\" : true\n } ]\n } ],\n \"sourceDescriptions\" : [ {\n \"id\" : \"SD_PERSON_LYXJ-QZ1\",\n \"about\" : \"https://integration.familysearch.org/ark:/61903/4:1:LYXJ-QZ1\",\n \"componentOf\" : {\n \"description\" : \"#SD_TREE_MMMM-MMM\",\n \"descriptionId\" : \"SD_TREE_MMMM-MMM\"\n },\n \"resourceType\" : \"http://gedcomx.org/Person\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/sources/descriptions/SD_PERSON_LYXJ-QZ1?flag=fsh\"\n }\n },\n \"citations\" : [ {\n \"lang\" : \"en\",\n \"value\" : \"\\\"Family Tree,\\\" database, FamilySearch (http://familysearch.org), entry for Ebenezer Clark (PID https://integration.familysearch.org/ark:/61903/4:1:LYXJ-QZ1 ); contributed by various users.\"\n } ],\n \"titles\" : [ {\n \"value\" : \"Ebenezer Clark\"\n } ],\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://integration.familysearch.org/ark:/61903/4:1:LYXJ-QZ1\" ]\n }\n }, {\n \"id\" : \"SD_TREE_MMMM-MMM\",\n \"about\" : \"https://api-integ.familysearch.org/platform/trees/MMMM-MMM\",\n \"componentOf\" : {\n \"description\" : \"#SD_COLLECTION_0\",\n \"descriptionId\" : \"SD_COLLECTION_0\"\n },\n \"resourceType\" : \"http://familysearch.org/FamilyTree\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/sources/descriptions/SD_TREE_MMMM-MMM?flag=fsh\"\n }\n },\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://api-integ.familysearch.org/platform/trees/MMMM-MMM\" ]\n }\n }, {\n \"id\" : \"SD_COLLECTION_0\",\n \"about\" : \"https://api-integ.familysearch.org/platform/collections/tree\",\n \"resourceType\" : \"http://gedcomx.org/Collection\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/sources/descriptions/SD_COLLECTION_0?flag=fsh\"\n }\n },\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://api-integ.familysearch.org/platform/collections/tree\" ]\n }\n } ],\n \"places\" : [ {\n \"id\" : \"3779514\",\n \"latitude\" : 41.31,\n \"longitude\" : -72.92417,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n }, {\n \"id\" : \"3779369\",\n \"latitude\" : 41.456389,\n \"longitude\" : -72.80472,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n } ]\n}" + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-QZ1' + content_type: application/x-fs-v1+json + http_code: 410 + header_size: 456 + request_size: 217 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.297014 + namelookup_time: 0.002055 + connect_time: 0.061546 + pretransfer_time: 0.181767 + size_upload: 0.0 + size_download: 11392.0 + speed_download: 38355.0 + speed_upload: 0.0 + download_content_length: -1.0 + upload_content_length: 0.0 + starttransfer_time: 0.279988 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53063 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 181661 + queue_time_us: 20 + connect_time_us: 61546 + namelookup_time_us: 2055 + pretransfer_time_us: 181767 + redirect_time_us: 0 + starttransfer_time_us: 279988 + posttransfer_time_us: 181766 + total_time_us: 297014 + effective_method: GET + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 diff --git a/tests/fixtures/testGet.json b/tests/fixtures/testGet.json index 8cc8f77..92952e2 100644 --- a/tests/fixtures/testGet.json +++ b/tests/fixtures/testGet.json @@ -99,4 +99,234 @@ }, "body": "{\n \"links\" : {\n \"alternate\" : [ {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/tree\/person\/L5F4-S1K\/details\"\n } ]\n },\n \"description\" : \"#SD-L5F4-S1K\",\n \"persons\" : [ {\n \"id\" : \"L5F4-S1K\",\n \"sortKey\" : \"0000000000\",\n \"living\" : false,\n \"gender\" : {\n \"id\" : \"17ee8a5e-c793-4a3d-8bc6-88e4bfc75ee9\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094756026\n },\n \"type\" : \"http:\/\/gedcomx.org\/Male\",\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/conclusions\/17ee8a5e-c793-4a3d-8bc6-88e4bfc75ee9\"\n }\n }\n },\n \"links\" : {\n \"spouses\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/spouses\"\n },\n \"change-history\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/changes\"\n },\n \"ancestry\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/ancestry?person=L5F4-S1K\"\n },\n \"notes\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/notes\"\n },\n \"non-matches\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/not-a-match\"\n },\n \"portraits\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/portraits\"\n },\n \"ordinances\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/ordinances\"\n },\n \"collection\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/collections\/tree\"\n },\n \"families\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/families\"\n },\n \"portrait\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/portrait\"\n },\n \"matches\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/matches\"\n },\n \"children\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/children\"\n },\n \"descendancy\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/descendancy?person=L5F4-S1K\"\n },\n \"person\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\"\n },\n \"source-descriptions\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/sources\"\n },\n \"merge\" : {\n \"template\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/{pid}\/merges\/{dpid}{?access_token,filter}\",\n \"type\" : \"application\/json,application\/x-fs-v1+json,application\/x-fs-v1+xml,application\/xml,text\/html\",\n \"accept\" : \"application\/x-fs-v1+json,application\/x-fs-v1+xml\",\n \"allow\" : \"OPTIONS,GET,POST\",\n \"title\" : \"Person Merge\"\n },\n \"ordinance-reservations\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/reservations\"\n },\n \"artifacts\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/memories\"\n },\n \"parents\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/parents\"\n }\n },\n \"identifiers\" : {\n \"http:\/\/gedcomx.org\/Persistent\" : [ \"https:\/\/integration.familysearch.org\/ark:\/61903\/4:1:L5F4-S1K\" ]\n },\n \"names\" : [ {\n \"id\" : \"62b1334f-1f61-4560-8109-d3552e123cbd\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094756026\n },\n \"type\" : \"http:\/\/gedcomx.org\/BirthName\",\n \"preferred\" : true,\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/conclusions\/62b1334f-1f61-4560-8109-d3552e123cbd\"\n }\n },\n \"nameForms\" : [ {\n \"lang\" : \"en\",\n \"fullText\" : \"Ebenezer Clark\",\n \"parts\" : [ {\n \"type\" : \"http:\/\/gedcomx.org\/Given\",\n \"value\" : \"Ebenezer\"\n }, {\n \"type\" : \"http:\/\/gedcomx.org\/Surname\",\n \"value\" : \"Clark\"\n } ],\n \"nameFormInfo\" : [ {\n \"order\" : \"http:\/\/familysearch.org\/v1\/Eurotypic\"\n } ]\n } ]\n } ],\n \"facts\" : [ {\n \"id\" : \"6b13e6b4-a9bd-43d6-a7fd-c0b07b3ae016\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094756026\n },\n \"type\" : \"http:\/\/gedcomx.org\/Birth\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n }, {\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/conclusions\/6b13e6b4-a9bd-43d6-a7fd-c0b07b3ae016\"\n }\n }\n }, {\n \"id\" : \"7187ba53-dd16-4c13-aa45-f9f2d71a8a2c\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094756026\n },\n \"type\" : \"http:\/\/gedcomx.org\/Death\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n }, {\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/conclusions\/7187ba53-dd16-4c13-aa45-f9f2d71a8a2c\"\n }\n }\n }, {\n \"id\" : \"ae83d185-bdd1-4781-8178-fed90fbc2d3e\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094756026\n },\n \"type\" : \"http:\/\/gedcomx.org\/Christening\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n }, {\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/conclusions\/ae83d185-bdd1-4781-8178-fed90fbc2d3e\"\n }\n }\n }, {\n \"id\" : \"8acccc44-160d-4ed0-a0db-9497fed8aab0\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https:\/\/api-integ.familysearch.org\/platform\/users\/agents\/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1513094756026\n },\n \"type\" : \"http:\/\/gedcomx.org\/Burial\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n }, {\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/tree\/persons\/L5F4-S1K\/conclusions\/8acccc44-160d-4ed0-a0db-9497fed8aab0\"\n }\n }\n } ],\n \"display\" : {\n \"name\" : \"Ebenezer Clark\",\n \"gender\" : \"Male\",\n \"lifespan\" : \"1651-1721\",\n \"birthDate\" : \"29 November 1651\",\n \"birthPlace\" : \"New Haven, New Haven, Connecticut, United States\",\n \"deathDate\" : \"1721\",\n \"deathPlace\" : \"Wallingford, New Haven, Connecticut, United States\",\n \"ascendancyNumber\" : \"1\",\n \"descendancyNumber\" : \"1\"\n }\n } ],\n \"sourceDescriptions\" : [ {\n \"id\" : \"SD-L5F4-S1K\",\n \"about\" : \"#L5F4-S1K\",\n \"componentOf\" : {\n \"description\" : \"https:\/\/api-integ.familysearch.org\/platform\/collections\/tree\"\n },\n \"resourceType\" : \"http:\/\/gedcomx.org\/Person\",\n \"modified\" : 1513094756000,\n \"version\" : \"137323875560260000\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https:\/\/api-integ.familysearch.org\/platform\/sources\/descriptions\/SD-L5F4-S1K\"\n }\n },\n \"citations\" : [ {\n \"lang\" : \"en\",\n \"value\" : \"\\\"Family Tree,\\\" database, FamilySearch<\/i> (http:\/\/familysearch.org : modified 12 December 2017, 16:05), entry for Ebenezer Clark(PID https:\/\/integration.familysearch.org\/ark:\/61903\/4:1:L5F4-S1K); contributed by various users.\"\n } ],\n \"titles\" : [ {\n \"value\" : \"Ebenezer Clark\"\n } ],\n \"identifiers\" : {\n \"http:\/\/gedcomx.org\/Persistent\" : [ \"https:\/\/integration.familysearch.org\/ark:\/61903\/4:1:L5F4-S1K\" ]\n }\n } ],\n \"places\" : [ {\n \"id\" : \"3779514\",\n \"latitude\" : 41.31,\n \"longitude\" : -72.92417,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n }, {\n \"id\" : \"3779369\",\n \"latitude\" : 41.456389,\n \"longitude\" : -72.80472,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n } ]\n}" } -}] \ No newline at end of file +} +- + request: + method: POST + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + headers: + Host: integration.familysearch.org + content-type: application/x-www-form-urlencoded + Authorization: 'Bearer i0-FvlZPhnpx4x.1xoBEEHS~vN' + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + body: 'grant_type=password&client_id=a02j000000CBv4gAAD&username=sdktester&password=1234sdkpass' + response: + status: + code: 200 + message: '' + headers: + content-type: application/json;charset=UTF-8 + content-length: '111' + date: 'Thu, 18 Jun 2026 01:11:59 GMT' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + cache-control: no-store + content-language: en-US + server: nginx + via: '1.1 d5e9313fa5148ebdba4664d3e2a90f58.cloudfront.net (CloudFront)' + content-security-policy: "frame-ancestors 'self' https://*.familysearch.org https://*.familysearch.psdops.com https://*.church.brightspot.cloud http://localhost:* " + x-frame-options: SAMEORIGIN + x-cache: 'Miss from cloudfront' + x-amz-cf-pop: SEA900-P1 + x-amz-cf-id: xeSCamNueMhSybzZodUY_gO1UoFHEsUuHV_WWTwJ6k20J_UTijJD_w== + set-cookie: ['visid_incap_2846689=v65XVUQvR1yGcZNdnfAokNxFM2oAAAAAQUIPAAAAAADZFo04XoN9nbkHohlzEZtm; expires=Thu, 17 Jun 2027 06:53:04 GMT; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'nlbi_2846689=jo2hSFomLi6u41suNegyBwAAAADfyAveV4F7S83kFIu4n43g; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'incap_ses_2107_2846689=GbMsRB4YeVhZ2vI965E9Hd9FM2oAAAAAkMJ9g+kQCVfyQNFdyiTefw==; path=/; Domain=.familysearch.org; Secure; SameSite=None'] + strict-transport-security: 'max-age=31536000; includeSubDomains' + x-cdn: Imperva + x-iinfo: '18-60964533-60964544 NNNY CT(1 5 0) RT(1781745118595 36) q(0 1 1 4) r(5 5) U24' + body: '{"access_token":"i0-m3yKkDI89Mz.433aPO8P3fy","token_type":"family_search","token":"i0-m3yKkDI89Mz.433aPO8P3fy"}' + curl_info: + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + content_type: application/json;charset=UTF-8 + http_code: 200 + header_size: 1322 + request_size: 349 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.588321 + namelookup_time: 0.005366 + connect_time: 0.031011 + pretransfer_time: 0.057383 + size_upload: 88.0 + size_download: 111.0 + speed_download: 188.0 + speed_upload: 149.0 + download_content_length: 111.0 + upload_content_length: 88.0 + starttransfer_time: 0.58826 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 45.223.160.251 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53052 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 57259 + queue_time_us: 25 + connect_time_us: 31011 + namelookup_time_us: 5366 + pretransfer_time_us: 57383 + redirect_time_us: 0 + starttransfer_time_us: 588260 + posttransfer_time_us: 57382 + total_time_us: 588321 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: POST + url: 'https://api-integ.familysearch.org/platform/tree/persons' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-m3yKkDI89Mz.433aPO8P3fy' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + content-type: application/x-fs-v1+json + body: '{"persons":[{"sources":[{"id":"34077598-142f-4784-b1e7-329e2b5a0625","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/34077598-142f-4784-b1e7-329e2b5a0625"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770475882},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},{"id":"c290dcce-f7eb-447b-8122-c03ae16f9b96","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/c290dcce-f7eb-447b-8122-c03ae16f9b96"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770441164},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"}],"sortKey":"0000000000","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"living":false,"gender":{"id":"8b165ed0-5377-4c55-b4c5-1d6407166e3f","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8b165ed0-5377-4c55-b4c5-1d6407166e3f"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Male"},"names":[{"id":"54910b54-274d-461c-adda-7190479bc4c7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/54910b54-274d-461c-adda-7190479bc4c7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/BirthName","nameForms":[{"fullText":"Ebenezer Clark","parts":[{"type":"http:\/\/gedcomx.org\/Given","value":"Ebenezer"},{"type":"http:\/\/gedcomx.org\/Surname","value":"Clark"}]}],"preferred":true}],"facts":[{"id":"99519cb9-a8bf-4914-9f11-ccf93492b48b","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/99519cb9-a8bf-4914-9f11-ccf93492b48b"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Birth","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}},{"id":"8e9dd699-4cea-4d30-8ff2-d5d11b171937","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8e9dd699-4cea-4d30-8ff2-d5d11b171937"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Death","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"80c2512c-d2bc-422c-a0b8-66fb4621c2f7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/80c2512c-d2bc-422c-a0b8-66fb4621c2f7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Burial","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"c36105fd-4502-4a35-867c-308623e24299","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/c36105fd-4502-4a35-867c-308623e24299"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Christening","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}}]}],"sourceDescriptions":[{"id":"SD-L5C2-WYC","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/SD-L5C2-WYC"}},"citations":[{"lang":"en","value":"\"Family Tree,\" database, FamilySearch<\/i> (http:\/\/familysearch.org : modified 09 August 2016, 19:21), entry for Ebenezer Clark(PID https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC); contributed by various users."}],"about":"#L5C2-WYC","componentOf":{"description":"https:\/\/sandbox.familysearch.org\/platform\/collections\/tree"},"titles":[{"value":"Ebenezer Clark"}],"resourceType":"http:\/\/gedcomx.org\/Person","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"modified":1470770475000,"version":"136900632758820000"}]}' + response: + status: + code: 201 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:00 GMT' + content-length: '0' + location: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH' + cache-control: 'no-cache, no-store, max-age=0, must-revalidate' + link: ['; rel="ancestry"', '; rel="descendancy"', '; rel="matches"', '; rel="notes"', '; rel="persons"'] + server: nginx + vary: 'Accept,Accept-Language,Accept-Encoding,Expect' + warning: ['400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '199 FamilySearch "Too many warnings..."'] + x-entity-id: LYXJ-7MH + x-processing-time: '803' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons' + content_type: null + http_code: 201 + header_size: 2347 + request_size: 6722 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 1.312393 + namelookup_time: 0.002732 + connect_time: 0.063883 + pretransfer_time: 0.235632 + size_upload: 6451.0 + size_download: 0.0 + speed_download: 0.0 + speed_upload: 4915.0 + download_content_length: 0.0 + upload_content_length: 6451.0 + starttransfer_time: 1.312291 + redirect_time: 0.0 + redirect_url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH' + primary_ip: 100.49.154.166 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53054 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 235461 + queue_time_us: 16 + connect_time_us: 63883 + namelookup_time_us: 2732 + pretransfer_time_us: 235632 + redirect_time_us: 0 + starttransfer_time_us: 1312291 + posttransfer_time_us: 235631 + total_time_us: 1312393 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: GET + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-m3yKkDI89Mz.433aPO8P3fy' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + response: + status: + code: 200 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:00 GMT' + content-type: application/x-fs-v1+json + allow: 'OPTIONS, HEAD, GET, POST, DELETE' + cache-control: 'max-age=0, must-revalidate, no-transform' + content-location: /tree/persons/LYXJ-7MH + etag: 'W/"140010379198250000"' + last-modified: 'Thu, 18 Jun 2026 01:11:59 GMT' + server: nginx + vary: 'accept,accept-language,accept-encoding,expect' + x-processing-time: '25' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + body: "{\n \"description\" : \"#SD_PERSON_LYXJ-7MH\",\n \"persons\" : [ {\n \"id\" : \"LYXJ-7MH\",\n \"sortKey\" : \"0000000000\",\n \"living\" : false,\n \"gender\" : {\n \"id\" : \"6613da3e-117b-4b6c-b5e7-1bbf065f8f34\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745119825\n },\n \"type\" : \"http://gedcomx.org/Male\",\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/conclusions/6613da3e-117b-4b6c-b5e7-1bbf065f8f34?flag=fsh\"\n }\n }\n },\n \"links\" : {\n \"spouses\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/spouses?flag=fsh\"\n },\n \"change-history\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/changes?flag=fsh\"\n },\n \"ancestry\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/ancestry?flag=fsh&person=LYXJ-7MH\"\n },\n \"notes\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/notes?flag=fsh\"\n },\n \"non-matches\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/not-a-match?flag=fsh\"\n },\n \"portraits\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/portraits?flag=fsh\"\n },\n \"collection\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/collections/tree?flag=fsh\"\n },\n \"families\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/families?flag=fsh\"\n },\n \"portrait\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/portrait?flag=fsh\"\n },\n \"matches\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/matches?flag=fsh\"\n },\n \"children\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/children?flag=fsh\"\n },\n \"descendancy\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/descendancy?flag=fsh&person=LYXJ-7MH\"\n },\n \"person\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH?flag=fsh\"\n },\n \"source-descriptions\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/sources?flag=fsh\"\n },\n \"merge\" : {\n \"template\" : \"https://api-integ.familysearch.org/platform/tree/persons/{pid}/merges/{dpid}?flag=fst{&filter,access_token}\",\n \"type\" : \"application/json,application/x-fs-v1+json,application/x-fs-v1+xml,application/xml,text/html\",\n \"accept\" : \"*/*\",\n \"allow\" : \"GET,OPTIONS,POST\",\n \"title\" : \"Person Merge\"\n },\n \"artifacts\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/memories?flag=fsh\"\n },\n \"parents\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/parents?flag=fsh\"\n }\n },\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://integration.familysearch.org/ark:/61903/4:1:LYXJ-7MH\" ]\n },\n \"names\" : [ {\n \"id\" : \"81605530-6376-4702-aeb4-5b9e355d53d2\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745119825\n },\n \"type\" : \"http://gedcomx.org/BirthName\",\n \"preferred\" : true,\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/conclusions/81605530-6376-4702-aeb4-5b9e355d53d2?flag=fsh\"\n }\n },\n \"nameForms\" : [ {\n \"lang\" : \"en\",\n \"fullText\" : \"Ebenezer Clark\",\n \"parts\" : [ {\n \"type\" : \"http://gedcomx.org/Given\",\n \"value\" : \"Ebenezer\"\n }, {\n \"type\" : \"http://gedcomx.org/Surname\",\n \"value\" : \"Clark\"\n } ],\n \"nameFormInfo\" : [ {\n \"order\" : \"http://familysearch.org/v1/Eurotypic\"\n } ]\n } ]\n } ],\n \"facts\" : [ {\n \"id\" : \"d953dd6c-e0fc-4515-804a-e874d5e20984\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745119825\n },\n \"type\" : \"http://gedcomx.org/Birth\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/conclusions/d953dd6c-e0fc-4515-804a-e874d5e20984?flag=fsh\"\n }\n }\n }, {\n \"id\" : \"b1a067cb-9a7a-497c-aeb6-12a24e7ac223\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745119825\n },\n \"type\" : \"http://gedcomx.org/Death\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/conclusions/b1a067cb-9a7a-497c-aeb6-12a24e7ac223?flag=fsh\"\n }\n }\n }, {\n \"id\" : \"6a49e48c-856e-4a45-bc6a-9c7945ce58b5\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745119825\n },\n \"type\" : \"http://gedcomx.org/Christening\",\n \"date\" : {\n \"original\" : \"29 Nov 1651\",\n \"formal\" : \"+1651-11-29\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"29 November 1651\"\n } ]\n },\n \"place\" : {\n \"original\" : \"NEW HAVEN,NEW HAVEN,CONN\",\n \"description\" : \"#3779514\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/conclusions/6a49e48c-856e-4a45-bc6a-9c7945ce58b5?flag=fsh\"\n }\n }\n }, {\n \"id\" : \"f7b68595-f9ca-42c4-802e-26bfa7a880db\",\n \"attribution\" : {\n \"contributor\" : {\n \"resource\" : \"https://api-integ.familysearch.org/platform/users/agents/MM6M-8QJ\",\n \"resourceId\" : \"MM6M-8QJ\"\n },\n \"modified\" : 1781745119825\n },\n \"type\" : \"http://gedcomx.org/Burial\",\n \"date\" : {\n \"original\" : \"1721\",\n \"formal\" : \"+1721\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"1721\"\n } ]\n },\n \"place\" : {\n \"original\" : \"WALLINGFORD,NEW HAVEN CONN.\",\n \"description\" : \"#3779369\",\n \"normalized\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n },\n \"links\" : {\n \"conclusion\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH/conclusions/f7b68595-f9ca-42c4-802e-26bfa7a880db?flag=fsh\"\n }\n }\n } ],\n \"display\" : {\n \"name\" : \"Ebenezer Clark\",\n \"gender\" : \"Male\",\n \"lifespan\" : \"1651-1721\",\n \"birthDate\" : \"29 November 1651\",\n \"birthPlace\" : \"New Haven, New Haven, Connecticut, United States\",\n \"deathDate\" : \"1721\",\n \"deathPlace\" : \"Wallingford, New Haven, Connecticut, United States\",\n \"ascendancyNumber\" : \"1\",\n \"descendancyNumber\" : \"1\"\n },\n \"personInfo\" : [ {\n \"canUserEdit\" : true,\n \"visibleToAll\" : true,\n \"visibleToAllWhenUsingFamilySearchApps\" : true\n } ]\n } ],\n \"sourceDescriptions\" : [ {\n \"id\" : \"SD_PERSON_LYXJ-7MH\",\n \"about\" : \"https://integration.familysearch.org/ark:/61903/4:1:LYXJ-7MH\",\n \"componentOf\" : {\n \"description\" : \"#SD_TREE_MMMM-MMM\",\n \"descriptionId\" : \"SD_TREE_MMMM-MMM\"\n },\n \"resourceType\" : \"http://gedcomx.org/Person\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/sources/descriptions/SD_PERSON_LYXJ-7MH?flag=fsh\"\n }\n },\n \"citations\" : [ {\n \"lang\" : \"en\",\n \"value\" : \"\\\"Family Tree,\\\" database, FamilySearch (http://familysearch.org), entry for Ebenezer Clark (PID https://integration.familysearch.org/ark:/61903/4:1:LYXJ-7MH ); contributed by various users.\"\n } ],\n \"titles\" : [ {\n \"value\" : \"Ebenezer Clark\"\n } ],\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://integration.familysearch.org/ark:/61903/4:1:LYXJ-7MH\" ]\n }\n }, {\n \"id\" : \"SD_TREE_MMMM-MMM\",\n \"about\" : \"https://api-integ.familysearch.org/platform/trees/MMMM-MMM\",\n \"componentOf\" : {\n \"description\" : \"#SD_COLLECTION_0\",\n \"descriptionId\" : \"SD_COLLECTION_0\"\n },\n \"resourceType\" : \"http://familysearch.org/FamilyTree\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/sources/descriptions/SD_TREE_MMMM-MMM?flag=fsh\"\n }\n },\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://api-integ.familysearch.org/platform/trees/MMMM-MMM\" ]\n }\n }, {\n \"id\" : \"SD_COLLECTION_0\",\n \"about\" : \"https://api-integ.familysearch.org/platform/collections/tree\",\n \"resourceType\" : \"http://gedcomx.org/Collection\",\n \"links\" : {\n \"description\" : {\n \"href\" : \"https://api-integ.familysearch.org/platform/sources/descriptions/SD_COLLECTION_0?flag=fsh\"\n }\n },\n \"identifiers\" : {\n \"http://gedcomx.org/Persistent\" : [ \"https://api-integ.familysearch.org/platform/collections/tree\" ]\n }\n } ],\n \"places\" : [ {\n \"id\" : \"3779514\",\n \"latitude\" : 41.31,\n \"longitude\" : -72.92417,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"New Haven, New Haven, Connecticut, United States\"\n } ]\n }, {\n \"id\" : \"3779369\",\n \"latitude\" : 41.456389,\n \"longitude\" : -72.80472,\n \"names\" : [ {\n \"lang\" : \"en-US\",\n \"value\" : \"Wallingford, New Haven, Connecticut, United States\"\n } ]\n } ]\n}" + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-7MH' + content_type: application/x-fs-v1+json + http_code: 200 + header_size: 481 + request_size: 217 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.295491 + namelookup_time: 0.003211 + connect_time: 0.062325 + pretransfer_time: 0.182678 + size_upload: 0.0 + size_download: 11261.0 + speed_download: 38109.0 + speed_upload: 0.0 + download_content_length: -1.0 + upload_content_length: 0.0 + starttransfer_time: 0.271146 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53055 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 182443 + queue_time_us: 21 + connect_time_us: 62325 + namelookup_time_us: 3211 + pretransfer_time_us: 182678 + redirect_time_us: 0 + starttransfer_time_us: 271146 + posttransfer_time_us: 182675 + total_time_us: 295491 + effective_method: GET + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 diff --git a/tests/fixtures/testHead.json b/tests/fixtures/testHead.json index c5683a4..69d6f45 100644 --- a/tests/fixtures/testHead.json +++ b/tests/fixtures/testHead.json @@ -98,4 +98,233 @@ "Connection": "keep-alive" } } -}] \ No newline at end of file +} +- + request: + method: POST + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + headers: + Host: integration.familysearch.org + content-type: application/x-www-form-urlencoded + Authorization: 'Bearer i0-m3yKkDI89Mz.433aPO8P3fy' + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + body: 'grant_type=password&client_id=a02j000000CBv4gAAD&username=sdktester&password=1234sdkpass' + response: + status: + code: 200 + message: '' + headers: + content-type: application/json;charset=UTF-8 + content-length: '111' + date: 'Thu, 18 Jun 2026 01:12:01 GMT' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + cache-control: no-store + content-language: en-US + server: nginx + via: '1.1 ec62626c4e205f1980b4ed65142b10d8.cloudfront.net (CloudFront)' + content-security-policy: "frame-ancestors 'self' https://*.familysearch.org https://*.familysearch.psdops.com https://*.church.brightspot.cloud http://localhost:* " + x-frame-options: SAMEORIGIN + x-cache: 'Miss from cloudfront' + x-amz-cf-pop: SEA900-P1 + x-amz-cf-id: xDYyEV8jNFHuKnDjnGzbGAg2tOcSyHYnIC-wCX2R4vx2NbNxp015cA== + set-cookie: ['visid_incap_2846689=v65XVUQvR1yGcZNdnfAokNxFM2oAAAAAQUIPAAAAAADZFo04XoN9nbkHohlzEZtm; expires=Thu, 17 Jun 2027 06:53:04 GMT; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'nlbi_2846689=mGgWRkMcFl6T/jhDNegyBwAAAAAtSalnS1RW10J9G2QGnFBj; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'incap_ses_2107_2846689=Lf8pfsxglFlZ2vI965E9HeFFM2oAAAAAl+DHdKdUcUFAHAB/Gm1L2w==; path=/; Domain=.familysearch.org; Secure; SameSite=None'] + strict-transport-security: 'max-age=31536000; includeSubDomains' + x-cdn: Imperva + x-iinfo: '12-26723568-26723571 NNNN CT(2 3 0) RT(1781745120902 31) q(0 0 0 0) r(5 5) U24' + body: '{"access_token":"i0-7ANgAORfIMh.WiaMK_jMH19","token_type":"family_search","token":"i0-7ANgAORfIMh.WiaMK_jMH19"}' + curl_info: + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + content_type: application/json;charset=UTF-8 + http_code: 200 + header_size: 1322 + request_size: 349 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.704565 + namelookup_time: 0.003607 + connect_time: 0.027376 + pretransfer_time: 0.139275 + size_upload: 88.0 + size_download: 111.0 + speed_download: 157.0 + speed_upload: 124.0 + download_content_length: 111.0 + upload_content_length: 88.0 + starttransfer_time: 0.704506 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 45.223.160.251 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53056 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 139161 + queue_time_us: 18 + connect_time_us: 27376 + namelookup_time_us: 3607 + pretransfer_time_us: 139275 + redirect_time_us: 0 + starttransfer_time_us: 704506 + posttransfer_time_us: 139273 + total_time_us: 704565 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: POST + url: 'https://api-integ.familysearch.org/platform/tree/persons' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-7ANgAORfIMh.WiaMK_jMH19' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + content-type: application/x-fs-v1+json + body: '{"persons":[{"sources":[{"id":"34077598-142f-4784-b1e7-329e2b5a0625","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/34077598-142f-4784-b1e7-329e2b5a0625"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770475882},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},{"id":"c290dcce-f7eb-447b-8122-c03ae16f9b96","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/c290dcce-f7eb-447b-8122-c03ae16f9b96"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770441164},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"}],"sortKey":"0000000000","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"living":false,"gender":{"id":"8b165ed0-5377-4c55-b4c5-1d6407166e3f","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8b165ed0-5377-4c55-b4c5-1d6407166e3f"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Male"},"names":[{"id":"54910b54-274d-461c-adda-7190479bc4c7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/54910b54-274d-461c-adda-7190479bc4c7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/BirthName","nameForms":[{"fullText":"Ebenezer Clark","parts":[{"type":"http:\/\/gedcomx.org\/Given","value":"Ebenezer"},{"type":"http:\/\/gedcomx.org\/Surname","value":"Clark"}]}],"preferred":true}],"facts":[{"id":"99519cb9-a8bf-4914-9f11-ccf93492b48b","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/99519cb9-a8bf-4914-9f11-ccf93492b48b"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Birth","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}},{"id":"8e9dd699-4cea-4d30-8ff2-d5d11b171937","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8e9dd699-4cea-4d30-8ff2-d5d11b171937"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Death","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"80c2512c-d2bc-422c-a0b8-66fb4621c2f7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/80c2512c-d2bc-422c-a0b8-66fb4621c2f7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Burial","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"c36105fd-4502-4a35-867c-308623e24299","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/c36105fd-4502-4a35-867c-308623e24299"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Christening","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}}]}],"sourceDescriptions":[{"id":"SD-L5C2-WYC","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/SD-L5C2-WYC"}},"citations":[{"lang":"en","value":"\"Family Tree,\" database, FamilySearch<\/i> (http:\/\/familysearch.org : modified 09 August 2016, 19:21), entry for Ebenezer Clark(PID https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC); contributed by various users."}],"about":"#L5C2-WYC","componentOf":{"description":"https:\/\/sandbox.familysearch.org\/platform\/collections\/tree"},"titles":[{"value":"Ebenezer Clark"}],"resourceType":"http:\/\/gedcomx.org\/Person","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"modified":1470770475000,"version":"136900632758820000"}]}' + response: + status: + code: 201 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:01 GMT' + content-length: '0' + location: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-3TN' + cache-control: 'no-cache, no-store, max-age=0, must-revalidate' + link: ['; rel="ancestry"', '; rel="descendancy"', '; rel="matches"', '; rel="notes"', '; rel="persons"'] + server: nginx + vary: 'Accept,Accept-Language,Accept-Encoding,Expect' + warning: ['400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '199 FamilySearch "Too many warnings..."'] + x-entity-id: LYXJ-3TN + x-processing-time: '240' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons' + content_type: null + http_code: 201 + header_size: 2347 + request_size: 6722 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.533823 + namelookup_time: 0.006473 + connect_time: 0.075957 + pretransfer_time: 0.226674 + size_upload: 6451.0 + size_download: 0.0 + speed_download: 0.0 + speed_upload: 12084.0 + download_content_length: 0.0 + upload_content_length: 6451.0 + starttransfer_time: 0.533704 + redirect_time: 0.0 + redirect_url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-3TN' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53057 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 226426 + queue_time_us: 44 + connect_time_us: 75957 + namelookup_time_us: 6473 + pretransfer_time_us: 226674 + redirect_time_us: 0 + starttransfer_time_us: 533704 + posttransfer_time_us: 226672 + total_time_us: 533823 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: GET + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-3TN' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-7ANgAORfIMh.WiaMK_jMH19' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + response: + status: + code: 200 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:02 GMT' + content-type: application/x-fs-v1+json + allow: 'OPTIONS, HEAD, GET, POST, DELETE' + cache-control: 'max-age=0, must-revalidate, no-transform' + content-location: /tree/persons/LYXJ-3TN + etag: 'W/"140010379219020000"' + last-modified: 'Thu, 18 Jun 2026 01:12:01 GMT' + server: nginx + vary: 'accept,accept-language,accept-encoding,expect' + x-processing-time: '28' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-3TN' + content_type: application/x-fs-v1+json + http_code: 200 + header_size: 481 + request_size: 217 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.33629 + namelookup_time: 0.004154 + connect_time: 0.068261 + pretransfer_time: 0.227816 + size_upload: 0.0 + size_download: 0.0 + speed_download: 0.0 + speed_upload: 0.0 + download_content_length: -1.0 + upload_content_length: 0.0 + starttransfer_time: 0.336146 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53059 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 227709 + queue_time_us: 26 + connect_time_us: 68261 + namelookup_time_us: 4154 + pretransfer_time_us: 227816 + redirect_time_us: 0 + starttransfer_time_us: 336146 + posttransfer_time_us: 227815 + total_time_us: 336290 + effective_method: GET + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 diff --git a/tests/fixtures/testPost.json b/tests/fixtures/testPost.json index acfc74e..33ea2ec 100644 --- a/tests/fixtures/testPost.json +++ b/tests/fixtures/testPost.json @@ -66,4 +66,160 @@ "Connection": "keep-alive" } } -}] \ No newline at end of file +} +- + request: + method: POST + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + headers: + Host: integration.familysearch.org + content-type: application/x-www-form-urlencoded + Authorization: 'Bearer i0-BdS4SMN7twv.q0UyPYJ~O1c' + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + body: 'grant_type=password&client_id=a02j000000CBv4gAAD&username=sdktester&password=1234sdkpass' + response: + status: + code: 200 + message: '' + headers: + content-type: application/json;charset=UTF-8 + content-length: '111' + date: 'Thu, 18 Jun 2026 01:11:57 GMT' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + cache-control: no-store + content-language: en-US + server: nginx + via: '1.1 8e6c2cf5874f5e4093136cc3de4d856a.cloudfront.net (CloudFront)' + content-security-policy: "frame-ancestors 'self' https://*.familysearch.org https://*.familysearch.psdops.com https://*.church.brightspot.cloud http://localhost:* " + x-frame-options: SAMEORIGIN + x-cache: 'Miss from cloudfront' + x-amz-cf-pop: SEA900-P1 + x-amz-cf-id: KpOx15qensVvdYv-z11x0oQLXJMVgyixfcehlGGo4U9ZopMifSFJRw== + set-cookie: ['visid_incap_2846689=v65XVUQvR1yGcZNdnfAokNxFM2oAAAAAQUIPAAAAAADZFo04XoN9nbkHohlzEZtm; expires=Thu, 17 Jun 2027 06:53:04 GMT; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'nlbi_2846689=nq8QCzk+kCSP/AfQNegyBwAAAADHqyomOugLnQkjzAqyWZ6Z; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'incap_ses_2107_2846689=G5KLWNJxuF5Z2vI965E9Hd1FM2oAAAAA+HWEwVgpi2mF8V4i/SXHIw==; path=/; Domain=.familysearch.org; Secure; SameSite=None'] + strict-transport-security: 'max-age=31536000; includeSubDomains' + x-cdn: Imperva + x-iinfo: '13-37154974-37154979 NNNY CT(1 6 0) RT(1781745117037 32) q(0 0 0 16) r(5 5) U24' + body: '{"access_token":"i0-FvlZPhnpx4x.1xoBEEHS~vN","token_type":"family_search","token":"i0-FvlZPhnpx4x.1xoBEEHS~vN"}' + curl_info: + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + content_type: application/json;charset=UTF-8 + http_code: 200 + header_size: 1323 + request_size: 349 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.644204 + namelookup_time: 0.002242 + connect_time: 0.023714 + pretransfer_time: 0.048861 + size_upload: 88.0 + size_download: 111.0 + speed_download: 172.0 + speed_upload: 136.0 + download_content_length: 111.0 + upload_content_length: 88.0 + starttransfer_time: 0.644137 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 45.223.160.251 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53050 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 48786 + queue_time_us: 18 + connect_time_us: 23714 + namelookup_time_us: 2242 + pretransfer_time_us: 48861 + redirect_time_us: 0 + starttransfer_time_us: 644137 + posttransfer_time_us: 48860 + total_time_us: 644204 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: POST + url: 'https://api-integ.familysearch.org/platform/tree/persons' + headers: + Host: api-integ.familysearch.org + Authorization: 'Bearer i0-FvlZPhnpx4x.1xoBEEHS~vN' + Accept: application/x-fs-v1+json + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5' + content-type: application/x-fs-v1+json + body: '{"persons":[{"sources":[{"id":"34077598-142f-4784-b1e7-329e2b5a0625","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/34077598-142f-4784-b1e7-329e2b5a0625"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770475882},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMV"},{"id":"c290dcce-f7eb-447b-8122-c03ae16f9b96","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"},"source-reference":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/source-references\/c290dcce-f7eb-447b-8122-c03ae16f9b96"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMDZ-8G7","resourceId":"MMDZ-8G7"},"modified":1470770441164},"description":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/MMZJ-GMN"}],"sortKey":"0000000000","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"living":false,"gender":{"id":"8b165ed0-5377-4c55-b4c5-1d6407166e3f","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8b165ed0-5377-4c55-b4c5-1d6407166e3f"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Male"},"names":[{"id":"54910b54-274d-461c-adda-7190479bc4c7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/54910b54-274d-461c-adda-7190479bc4c7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/BirthName","nameForms":[{"fullText":"Ebenezer Clark","parts":[{"type":"http:\/\/gedcomx.org\/Given","value":"Ebenezer"},{"type":"http:\/\/gedcomx.org\/Surname","value":"Clark"}]}],"preferred":true}],"facts":[{"id":"99519cb9-a8bf-4914-9f11-ccf93492b48b","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/99519cb9-a8bf-4914-9f11-ccf93492b48b"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Birth","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}},{"id":"8e9dd699-4cea-4d30-8ff2-d5d11b171937","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/8e9dd699-4cea-4d30-8ff2-d5d11b171937"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Death","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"80c2512c-d2bc-422c-a0b8-66fb4621c2f7","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/80c2512c-d2bc-422c-a0b8-66fb4621c2f7"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Burial","date":{"original":"1721","formal":"+1721","normalized":[{"lang":"en-US","value":"1721"},{"value":"1721"}]},"place":{"original":"WALLINGFORD,NEW HAVEN CONN.","description":"#1243627151","normalized":[{"lang":"en-US","value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"},{"value":"Wallingford, New Haven, Connecticut, United States"}]}},{"id":"c36105fd-4502-4a35-867c-308623e24299","links":{"conclusion":{"href":"https:\/\/sandbox.familysearch.org\/platform\/tree\/persons\/L5C2-WYC\/conclusions\/c36105fd-4502-4a35-867c-308623e24299"}},"attribution":{"contributor":{"resource":"https:\/\/sandbox.familysearch.org\/platform\/users\/agents\/MMFW-HTT","resourceId":"MMFW-HTT"},"modified":1467250315751},"type":"http:\/\/gedcomx.org\/Christening","date":{"original":"29 Nov 1651","formal":"+1651-11-29","normalized":[{"lang":"en-US","value":"29 November 1651"},{"value":"29 November 1651"}]},"place":{"original":"NEW HAVEN,NEW HAVEN,CONN","description":"#1740247784","normalized":[{"lang":"en-US","value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"},{"value":"New Haven, New Haven, Connecticut, United States"}]}}]}],"sourceDescriptions":[{"id":"SD-L5C2-WYC","links":{"description":{"href":"https:\/\/sandbox.familysearch.org\/platform\/sources\/descriptions\/SD-L5C2-WYC"}},"citations":[{"lang":"en","value":"\"Family Tree,\" database, FamilySearch<\/i> (http:\/\/familysearch.org : modified 09 August 2016, 19:21), entry for Ebenezer Clark(PID https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC); contributed by various users."}],"about":"#L5C2-WYC","componentOf":{"description":"https:\/\/sandbox.familysearch.org\/platform\/collections\/tree"},"titles":[{"value":"Ebenezer Clark"}],"resourceType":"http:\/\/gedcomx.org\/Person","identifiers":{"http:\/\/gedcomx.org\/Persistent":["https:\/\/sandbox.familysearch.org\/ark:\/61903\/4:1:L5C2-WYC"]},"modified":1470770475000,"version":"136900632758820000"}]}' + response: + status: + code: 201 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:11:58 GMT' + content-length: '0' + location: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-3TF' + cache-control: 'no-cache, no-store, max-age=0, must-revalidate' + link: ['; rel="ancestry"', '; rel="descendancy"', '; rel="matches"', '; rel="notes"', '; rel="persons"'] + server: nginx + vary: 'Accept,Accept-Language,Accept-Encoding,Expect' + warning: ['400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1740247784 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Failure in upstream call: Unable to read place representation. (upstream 404)"', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Unable to read place reference #1243627151 (Failure in upstream call: Unable to read place representation. (upstream 404))."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '400 FamilySearch "Multiple normalized date values were provided. Only the first will be accepted."', '199 FamilySearch "Too many warnings..."'] + x-entity-id: LYXJ-3TF + x-processing-time: '471' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + curl_info: + url: 'https://api-integ.familysearch.org/platform/tree/persons' + content_type: null + http_code: 201 + header_size: 2347 + request_size: 6722 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.886386 + namelookup_time: 0.166393 + connect_time: 0.227356 + pretransfer_time: 0.348013 + size_upload: 6451.0 + size_download: 0.0 + speed_download: 0.0 + speed_upload: 7277.0 + download_content_length: 0.0 + upload_content_length: 6451.0 + starttransfer_time: 0.886284 + redirect_time: 0.0 + redirect_url: 'https://api-integ.familysearch.org/platform/tree/persons/LYXJ-3TF' + primary_ip: 52.200.60.30 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53051 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 347576 + queue_time_us: 30 + connect_time_us: 227356 + namelookup_time_us: 166393 + pretransfer_time_us: 348013 + redirect_time_us: 0 + starttransfer_time_us: 886284 + posttransfer_time_us: 348009 + total_time_us: 886386 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 diff --git a/tests/fixtures/testUserAgent.json b/tests/fixtures/testUserAgent.json index a88529c..30abbce 100644 --- a/tests/fixtures/testUserAgent.json +++ b/tests/fixtures/testUserAgent.json @@ -59,4 +59,153 @@ }, "body": "{\n \"user-agent\": \"FS-PHP-Lite\/1.2.0 curl\/7.35.0 PHP\/5.5.9-1ubuntu4.17 myApp\/1.2.3\"\n}\n" } -}] \ No newline at end of file +} +- + request: + method: POST + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + headers: + Host: integration.familysearch.org + content-type: application/x-www-form-urlencoded + Authorization: 'Bearer i0-zHo~LWnPy0_.63BYzqFDMcZ' + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5 myApp/1.2.3' + body: 'grant_type=password&client_id=a02j000000CBv4gAAD&username=sdktester&password=1234sdkpass' + response: + status: + code: 200 + message: '' + headers: + content-type: application/json;charset=UTF-8 + content-length: '111' + date: 'Thu, 18 Jun 2026 01:12:04 GMT' + x-robots-tag: 'noindex, nofollow, noarchive, nosnippet, notranslate, noimageindex' + cache-control: no-store + content-language: en-US + server: nginx + via: '1.1 d5e9313fa5148ebdba4664d3e2a90f58.cloudfront.net (CloudFront)' + content-security-policy: "frame-ancestors 'self' https://*.familysearch.org https://*.familysearch.psdops.com https://*.church.brightspot.cloud http://localhost:* " + x-frame-options: SAMEORIGIN + x-cache: 'Miss from cloudfront' + x-amz-cf-pop: SEA900-P1 + x-amz-cf-id: UEjPl7YwSLaSPCu8G5C6EwKjMfHR3g_y-G_37LjcU1fSjlA328g30g== + set-cookie: ['visid_incap_2846689=0rLIgjVRSduCpFT7b8g7fORFM2oAAAAAQUIPAAAAAABLxiw228mTTOw3d/spowC9; expires=Thu, 17 Jun 2027 06:53:04 GMT; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'nlbi_2846689=JitXZARN/gKc7yhDNegyBwAAAABfSEJEF1/gj3+5rWiDt6OF; HttpOnly; path=/; Domain=.familysearch.org; Secure; SameSite=None', 'incap_ses_2107_2846689=fd9YTSRQsHNb7/I965E9HeRFM2oAAAAApMT81kUyG+bkmGHBOqQ5EQ==; path=/; Domain=.familysearch.org; Secure; SameSite=None'] + strict-transport-security: 'max-age=31536000; includeSubDomains' + x-cdn: Imperva + x-iinfo: '18-60965689-60964544 PNNy RT(1781745124445 26) q(0 0 0 0) r(5 5) U24' + body: '{"access_token":"i0-gD0wVxEZeDQ.xja6gU5nva1","token_type":"family_search","token":"i0-gD0wVxEZeDQ.xja6gU5nva1"}' + curl_info: + url: 'https://integration.familysearch.org/cis-web/oauth2/v3/token' + content_type: application/json;charset=UTF-8 + http_code: 200 + header_size: 1312 + request_size: 361 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.760382 + namelookup_time: 0.003519 + connect_time: 0.02699 + pretransfer_time: 0.051483 + size_upload: 88.0 + size_download: 111.0 + speed_download: 145.0 + speed_upload: 115.0 + download_content_length: 111.0 + upload_content_length: 88.0 + starttransfer_time: 0.760207 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 45.223.160.251 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53064 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 51421 + queue_time_us: 15 + connect_time_us: 26990 + namelookup_time_us: 3519 + pretransfer_time_us: 51483 + redirect_time_us: 0 + starttransfer_time_us: 760207 + posttransfer_time_us: 51482 + total_time_us: 760382 + effective_method: POST + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0 +- + request: + method: GET + url: 'https://httpbin.org/user-agent' + headers: + Host: httpbin.org + Authorization: 'Bearer i0-gD0wVxEZeDQ.xja6gU5nva1' + User-Agent: 'FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5 myApp/1.2.3' + response: + status: + code: 200 + message: '' + headers: + date: 'Thu, 18 Jun 2026 01:12:05 GMT' + content-type: application/json + content-length: '74' + server: gunicorn/19.9.0 + access-control-allow-origin: '*' + access-control-allow-credentials: 'true' + body: "{\n \"user-agent\": \"FS-PHP-Lite/1.2.0 curl/8.19.0 PHP/8.5.5 myApp/1.2.3\"\n}\n" + curl_info: + url: 'https://httpbin.org/user-agent' + content_type: application/json + http_code: 200 + header_size: 201 + request_size: 173 + filetime: -1 + ssl_verify_result: 0 + redirect_count: 0 + total_time: 0.561641 + namelookup_time: 0.160515 + connect_time: 0.220281 + pretransfer_time: 0.340193 + size_upload: 0.0 + size_download: 74.0 + speed_download: 131.0 + speed_upload: 0.0 + download_content_length: 74.0 + upload_content_length: 0.0 + starttransfer_time: 0.561605 + redirect_time: 0.0 + redirect_url: '' + primary_ip: 52.203.28.54 + certinfo: { } + primary_port: 443 + local_ip: 192.168.68.109 + local_port: 53065 + http_version: 3 + protocol: 2 + ssl_verifyresult: 0 + scheme: https + appconnect_time_us: 340074 + queue_time_us: 33 + connect_time_us: 220281 + namelookup_time_us: 160515 + pretransfer_time_us: 340193 + redirect_time_us: 0 + starttransfer_time_us: 561605 + posttransfer_time_us: 340191 + total_time_us: 561641 + effective_method: GET + capath: '' + cainfo: '' + used_proxy: 0 + httpauth_used: 0 + proxyauth_used: 0 + conn_id: 0 + index: 0