From 6922e1b4533595d35625b815790e072992a7ebcc Mon Sep 17 00:00:00 2001 From: Awilum Date: Mon, 14 Dec 2020 12:50:33 +0300 Subject: [PATCH] feat(fields): Add new field `fetch` for Entries API #492 --- .../Entries/Fields/FetchFieldTest.php | 54 ++++++++++++++++--- .../Fields/fixtures/entries/blog/entry.md | 7 +++ .../fixtures/entries/blog/post-1/entry.md | 3 ++ .../fixtures/entries/blog/post-2/entry.md | 3 ++ .../fixtures/entries/catalog/bikes/entry.md | 3 ++ .../entries/catalog/bikes/gt/entry.md | 27 ++++++++++ .../entries/catalog/bikes/norco/entry.md | 13 +++++ .../Fields/fixtures/entries/catalog/entry.md | 6 +++ .../Fields/fixtures/entries/level1/entry.md | 7 +++ .../fixtures/entries/level1/level2/entry.md | 7 +++ .../entries/level1/level2/level3/entry.md | 7 +++ .../level1/level2/level3/level4/entry.md | 3 ++ .../fixtures/entries/new-api/blog/entry.md | 7 +++ .../entries/new-api/blog/post-1/entry.md | 3 ++ .../entries/new-api/blog/post-2/entry.md | 3 ++ .../root/albums/category-1/album-1/entry.md | 21 ++++++++ .../entries/root/albums/category-1/entry.md | 3 ++ .../fixtures/entries/root/albums/entry.md | 3 ++ .../Fields/fixtures/entries/root/entry.md | 16 ++++++ 19 files changed, 188 insertions(+), 8 deletions(-) create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/blog/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/blog/post-1/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/blog/post-2/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/gt/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/norco/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/level1/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/level4/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-1/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-2/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/album-1/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/root/albums/entry.md create mode 100644 tests/Foundation/Entries/Fields/fixtures/entries/root/entry.md diff --git a/tests/Foundation/Entries/Fields/FetchFieldTest.php b/tests/Foundation/Entries/Fields/FetchFieldTest.php index 23a9cd1f..3072165f 100644 --- a/tests/Foundation/Entries/Fields/FetchFieldTest.php +++ b/tests/Foundation/Entries/Fields/FetchFieldTest.php @@ -10,15 +10,13 @@ afterEach(function (): void { filesystem()->directory(PATH['project'] . '/entries')->delete(); }); -test('test fetchField', function () { - - +test('test fetchField for catalog', function () { // Create catalog flextype('entries')->create('catalog', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/catalog/entry.md')->get())); - flextype('entries')->create('catalog/bikes', ['title' => 'Bikes']); - flextype('entries')->create('catalog/bikes/gt', ['title' => 'GT', 'brand' => 'gt']); - flextype('entries')->create('catalog/bikes/norco', ['title' => 'Norco', 'brand' => 'norco']); + flextype('entries')->create('catalog/bikes', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/entry.md')->get())); + flextype('entries')->create('catalog/bikes/gt', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/gt/entry.md')->get())); + flextype('entries')->create('catalog/bikes/norco', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/norco/entry.md')->get())); flextype('entries')->create('catalog/bikes/foo', ['title' => 'foo']); flextype('entries')->create('catalog/bikes/foo/bar', ['title' => 'bar']); @@ -31,7 +29,8 @@ test('test fetchField', function () { flextype('entries')->create('banner', ['title' => 'Banner']); $catalogSingle = flextype('entries')->fetch('catalog'); - $this->assertEquals(15, $catalogSingle->count()); + + $this->assertEquals(16, $catalogSingle->count()); $this->assertEquals('Catalog', $catalogSingle['title']); $this->assertEquals('catalog', $catalogSingle['id']); $this->assertEquals(1, $catalogSingle['bikes']->count()); @@ -42,7 +41,7 @@ test('test fetchField', function () { $this->assertEquals('30% off', $catalogSingle['discounts']['discounts/30-off']['title']); $catalogSingleWithCollectionFalse = flextype('entries')->fetch('catalog', 'single'); - $this->assertEquals(15, $catalogSingleWithCollectionFalse->count()); + $this->assertEquals(16, $catalogSingleWithCollectionFalse->count()); $this->assertEquals('Catalog', $catalogSingleWithCollectionFalse['title']); $this->assertEquals('catalog', $catalogSingleWithCollectionFalse['id']); $this->assertEquals(1, $catalogSingleWithCollectionFalse['bikes']->count()); @@ -64,3 +63,42 @@ test('test fetchField', function () { $this->assertEquals('Banner', $banner['title']); $this->assertEquals('banner', $banner['id']); }); + +test('test fetchField for blog', function () { + flextype('entries')->create('blog', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/blog/entry.md')->get())); + flextype('entries')->create('blog/post-1', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-1/entry.md')->get())); + flextype('entries')->create('blog/post-2', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-2/entry.md')->get())); + + $blog = flextype('entries')->fetch('blog')->sortKeys(); + + $this->assertEquals(14, $blog->count()); +}); + + +test('test fetchField for albmus', function () { + flextype('entries')->create('root', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/root/entry.md')->get())); + + flextype('entries')->create('albums', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/entry.md')->get())); + flextype('entries')->create('albums/category-1', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/entry.md')->get())); + flextype('entries')->create('albums/category-1/album-1', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/album-1/entry.md')->get())); + + flextype('entries')->create('banners', ['title' => 'Banners']); + flextype('entries')->create('banners/1', ['title' => 'Banner1']); + flextype('entries')->create('banners/2', ['title' => 'Banner2']); + + +}); + +test('test fetchField for long nested entries', function () { + flextype('entries')->create('level1', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/level1/entry.md')->get())); + flextype('entries')->create('level1/level2', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/entry.md')->get())); + flextype('entries')->create('level1/level2/level3', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/entry.md')->get())); + flextype('entries')->create('level1/level2/level3/level4', flextype('frontmatter')->decode(filesystem()->file(ROOT_DIR . '/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/level4/entry.md')->get())); + + $level = flextype('entries')->fetch('level1')->sortKeys(); + + $this->assertEquals(14, $level->count()); + $this->assertEquals('level1/level2', $level['root']['id']); + $this->assertEquals('level1/level2/level3', $level['root']['root']['id']); + $this->assertEquals('level1/level2/level3/level4', $level['root']['root']['root']['id']); +}); diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/blog/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/blog/entry.md new file mode 100644 index 00000000..9df762f1 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/blog/entry.md @@ -0,0 +1,7 @@ +--- +title: blog +fetch: + posts: + from: collection + id: blog +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-1/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-1/entry.md new file mode 100644 index 00000000..3789e730 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-1/entry.md @@ -0,0 +1,3 @@ +--- +title: Post 1 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-2/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-2/entry.md new file mode 100644 index 00000000..c940feff --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/blog/post-2/entry.md @@ -0,0 +1,3 @@ +--- +title: Post 2 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/entry.md new file mode 100644 index 00000000..a5b36979 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/entry.md @@ -0,0 +1,3 @@ +--- +title: Bikes +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/gt/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/gt/entry.md new file mode 100644 index 00000000..c8d7ca22 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/gt/entry.md @@ -0,0 +1,27 @@ +--- +title: GT +brand: gt +fetch: + discounts_available: + id: discounts + from: collection + options: + filter: + where: + - + key: category + operator: eq + value: bikes + label1: + from: single + id: discounts/50-off + options: + filter: + limit: 3 + label2: + from: single + id: discounts/30-off + options: + filter: + limit: 2 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/norco/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/norco/entry.md new file mode 100644 index 00000000..54d104cf --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/bikes/norco/entry.md @@ -0,0 +1,13 @@ +--- +title: Norco +brand: norco +fetch: + label: + from: single + id: discounts/30-off + options: [] + discounts: + from: collection + id: discounts + options: [] +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/catalog/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/entry.md index ae5efd3f..6cef8160 100644 --- a/tests/Foundation/Entries/Fields/fixtures/entries/catalog/entry.md +++ b/tests/Foundation/Entries/Fields/fixtures/entries/catalog/entry.md @@ -2,6 +2,12 @@ title: Catalog visibility: draft fetch: + label1: + from: single + id: discounts/50-off + options: + filter: + limit: 4 bikes: id: catalog/bikes from: collection diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/level1/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/level1/entry.md new file mode 100644 index 00000000..ea0663bb --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/level1/entry.md @@ -0,0 +1,7 @@ +--- +title: level1 +fetch: + root: + from: single + id: level1/level2 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/entry.md new file mode 100644 index 00000000..8e523370 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/entry.md @@ -0,0 +1,7 @@ +--- +title: level2 +fetch: + root: + from: single + id: level1/level2/level3 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/entry.md new file mode 100644 index 00000000..d2f4a0a6 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/entry.md @@ -0,0 +1,7 @@ +--- +title: level3 +fetch: + root: + from: single + id: level1/level2/level3/level4 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/level4/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/level4/entry.md new file mode 100644 index 00000000..27d64720 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/level1/level2/level3/level4/entry.md @@ -0,0 +1,3 @@ +--- +title: level4 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/entry.md new file mode 100644 index 00000000..2aa654d1 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/entry.md @@ -0,0 +1,7 @@ +--- +title: blog +fetch: + collection: + id: blog + from: collection +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-1/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-1/entry.md new file mode 100644 index 00000000..3789e730 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-1/entry.md @@ -0,0 +1,3 @@ +--- +title: Post 1 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-2/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-2/entry.md new file mode 100644 index 00000000..c940feff --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/new-api/blog/post-2/entry.md @@ -0,0 +1,3 @@ +--- +title: Post 2 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/album-1/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/album-1/entry.md new file mode 100644 index 00000000..4b810d65 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/album-1/entry.md @@ -0,0 +1,21 @@ +--- +title: Album 1 +fetch: + banner-single: + from: single + id: banners + banners-collection: + from: collection + id: banners + banners-collection-2: + from: collection + id: banners + options: + filter: + limit: 1 + find: + depth: ">0" + banner-single-2: + from: single + id: banners/2 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/entry.md new file mode 100644 index 00000000..55e77f02 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/category-1/entry.md @@ -0,0 +1,3 @@ +--- +title: Category1 +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/entry.md new file mode 100644 index 00000000..783ea710 --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/root/albums/entry.md @@ -0,0 +1,3 @@ +--- +title: Albums +--- diff --git a/tests/Foundation/Entries/Fields/fixtures/entries/root/entry.md b/tests/Foundation/Entries/Fields/fixtures/entries/root/entry.md new file mode 100644 index 00000000..76c9db0f --- /dev/null +++ b/tests/Foundation/Entries/Fields/fixtures/entries/root/entry.md @@ -0,0 +1,16 @@ +--- +title: Root +fetch: + single: + from: single + id: albums + collection: + from: collection + id: albums + collectionWithDepth: + from: collection + id: albums + options: + find: + depth: '>0' +---