| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832 |
- <?php
- namespace Webkul\BagistoApi\Tests\Feature\GraphQL;
- use Webkul\BagistoApi\Tests\GraphQLTestCase;
- class AttributeTest extends GraphQLTestCase
- {
- /**
- * Get Attributes - Basic
- */
- public function test_get_all_attributes_basic(): void
- {
- $query = <<<'GQL'
- query getAllAttributes($first: Int, $after: String) {
- attributes(first: $first, after: $after) {
- edges {
- node {
- id
- _id
- code
- adminName
- type
- swatchType
- position
- isRequired
- isConfigurable
- options {
- edges {
- node {
- id
- adminName
- swatchValue
- }
- }
- totalCount
- }
- }
- cursor
- }
- pageInfo {
- endCursor
- hasNextPage
- }
- totalCount
- }
- }
- GQL;
- $response = $this->graphQL($query, ['first' => 10]);
- $response->assertSuccessful();
- $data = $response->json('data.attributes');
- $this->assertNotNull($data, 'attributes response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributes.edges is not an array');
- $this->assertArrayHasKey('pageInfo', $data);
- $this->assertArrayHasKey('totalCount', $data);
- // Ensure at least one attribute is returned
- $this->assertGreaterThanOrEqual(0, $data['totalCount']);
- if (! empty($data['edges'])) {
- $first = $data['edges'][0]['node'] ?? null;
- $this->assertNotNull($first, 'first edge.node is null');
- $this->assertArrayHasKey('id', $first);
- $this->assertArrayHasKey('_id', $first);
- $this->assertArrayHasKey('code', $first);
- $this->assertArrayHasKey('adminName', $first);
- $this->assertArrayHasKey('type', $first);
- $this->assertArrayHasKey('options', $first);
- $this->assertIsArray($first['options']['edges'] ?? []);
- $this->assertArrayHasKey('totalCount', $first['options']);
- }
- }
- /**
- * Get Attribute - Basic
- */
- public function test_get_attribute_by_id_basic(): void
- {
- $query = <<<'GQL'
- query getAttributeByID($id: ID!){
- attribute(id: $id) {
- id
- _id
- code
- adminName
- type
- swatchType
- validation
- regex
- position
- isRequired
- isUnique
- isFilterable
- isComparable
- isConfigurable
- isUserDefined
- isVisibleOnFront
- valuePerLocale
- valuePerChannel
- defaultValue
- enableWysiwyg
- createdAt
- updatedAt
- columnName
- validations
- }
- }
- GQL;
- $variables = ['id' => '/api/shop/attributes/23'];
- $response = $this->graphQL($query, $variables);
- $response->assertSuccessful();
- $node = $response->json('data.attribute');
- $this->assertNotNull($node, 'attribute response is null');
- $this->assertArrayHasKey('id', $node);
- $this->assertArrayHasKey('_id', $node);
- $this->assertArrayHasKey('code', $node);
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('type', $node);
- $this->assertArrayHasKey('createdAt', $node);
- $this->assertArrayHasKey('updatedAt', $node);
- }
- /**
- * Get Attributes with full Options and Translations
- */
- public function test_get_all_attributes_with_full_options_and_translations(): void
- {
- $query = <<<'GQL'
- query getAllAttributes($first: Int) {
- attributes(first: $first) {
- edges {
- node {
- id
- _id
- code
- adminName
- type
- swatchType
- validation
- regex
- position
- isRequired
- isUnique
- isFilterable
- isComparable
- isConfigurable
- isUserDefined
- isVisibleOnFront
- valuePerLocale
- valuePerChannel
- defaultValue
- enableWysiwyg
- createdAt
- updatedAt
- columnName
- validations
- options {
- edges {
- node {
- id
- _id
- adminName
- sortOrder
- swatchValue
- swatchValueUrl
- translation {
- id
- _id
- attributeOptionId
- locale
- label
- }
- translations {
- edges {
- node {
- id
- _id
- attributeOptionId
- locale
- label
- }
- }
- pageInfo {
- endCursor
- hasNextPage
- }
- totalCount
- }
- }
- cursor
- }
- pageInfo {
- endCursor
- hasNextPage
- }
- totalCount
- }
- translations {
- edges {
- node {
- id
- _id
- attributeId
- locale
- name
- }
- }
- pageInfo {
- endCursor
- hasNextPage
- }
- totalCount
- }
- }
- cursor
- }
- pageInfo {
- endCursor
- startCursor
- hasNextPage
- hasPreviousPage
- }
- totalCount
- }
- }
- GQL;
- $response = $this->graphQL($query, ['first' => 5]);
- $response->assertSuccessful();
- $data = $response->json('data.attributes');
- $this->assertNotNull($data, 'attributes response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributes.edges is not an array');
- $this->assertArrayHasKey('pageInfo', $data);
- $this->assertArrayHasKey('totalCount', $data);
- // pageInfo expected keys
- $this->assertArrayHasKey('endCursor', $data['pageInfo']);
- $this->assertArrayHasKey('startCursor', $data['pageInfo']);
- $this->assertArrayHasKey('hasNextPage', $data['pageInfo']);
- $this->assertArrayHasKey('hasPreviousPage', $data['pageInfo']);
- if (! empty($data['edges'])) {
- foreach ($data['edges'] as $edge) {
- $node = $edge['node'] ?? null;
- $this->assertNotNull($node, 'edge.node is null');
- $this->assertArrayHasKey('id', $node);
- $this->assertArrayHasKey('_id', $node);
- $this->assertArrayHasKey('code', $node);
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('type', $node);
- $this->assertArrayHasKey('options', $node);
- // options structure
- $this->assertIsArray($node['options']['edges'] ?? []);
- $this->assertArrayHasKey('totalCount', $node['options']);
- foreach ($node['options']['edges'] ?? [] as $optEdge) {
- $opt = $optEdge['node'] ?? null;
- $this->assertNotNull($opt, 'option edge.node is null');
- $this->assertArrayHasKey('id', $opt);
- $this->assertArrayHasKey('_id', $opt);
- $this->assertArrayHasKey('adminName', $opt);
- // translation and translations
- $this->assertArrayHasKey('translation', $opt);
- $this->assertArrayHasKey('translations', $opt);
- $this->assertIsArray($opt['translations']['edges'] ?? []);
- $this->assertArrayHasKey('pageInfo', $opt['translations']);
- $this->assertArrayHasKey('totalCount', $opt['translations']);
- }
- // attribute translations
- $this->assertIsArray($node['translations']['edges'] ?? []);
- $this->assertArrayHasKey('pageInfo', $node['translations']);
- $this->assertArrayHasKey('totalCount', $node['translations']);
- }
- }
- }
- /**
- * Get Attribute with Full Details
- */
- public function test_get_attribute_by_id_full_details(): void
- {
- $query = <<<'GQL'
- query getAttributeByID($id: ID!){
- attribute(id: $id) {
- id
- _id
- code
- adminName
- type
- swatchType
- validation
- regex
- position
- isRequired
- isUnique
- isFilterable
- isComparable
- isConfigurable
- isUserDefined
- isVisibleOnFront
- valuePerLocale
- valuePerChannel
- defaultValue
- enableWysiwyg
- createdAt
- updatedAt
- columnName
- validations
- options {
- edges {
- node {
- id
- _id
- adminName
- sortOrder
- swatchValue
- swatchValueUrl
- translation {
- id
- _id
- attributeOptionId
- locale
- label
- }
- translations {
- edges {
- node {
- id
- _id
- attributeOptionId
- locale
- label
- }
- }
- pageInfo {
- endCursor
- startCursor
- hasNextPage
- hasPreviousPage
- }
- totalCount
- }
- }
- cursor
- }
- pageInfo {
- endCursor
- startCursor
- hasNextPage
- hasPreviousPage
- }
- totalCount
- }
- translations {
- edges {
- node {
- id
- _id
- attributeId
- locale
- name
- }
- cursor
- }
- pageInfo {
- endCursor
- startCursor
- hasNextPage
- hasPreviousPage
- }
- totalCount
- }
- }
- }
- GQL;
- $variables = ['id' => '/api/shop/attributes/23'];
- $response = $this->graphQL($query, $variables);
- $response->assertSuccessful();
- $node = $response->json('data.attribute');
- $this->assertNotNull($node, 'attribute response is null');
- $this->assertArrayHasKey('options', $node);
- $this->assertArrayHasKey('translations', $node);
- // options structure
- $this->assertIsArray($node['options']['edges'] ?? []);
- $this->assertArrayHasKey('pageInfo', $node['options']);
- $this->assertArrayHasKey('totalCount', $node['options']);
- foreach ($node['options']['edges'] ?? [] as $optEdge) {
- $opt = $optEdge['node'] ?? null;
- $this->assertNotNull($opt);
- $this->assertArrayHasKey('translation', $opt);
- $this->assertArrayHasKey('translations', $opt);
- $this->assertArrayHasKey('pageInfo', $opt['translations']);
- }
- // translations structure
- $this->assertIsArray($node['translations']['edges'] ?? []);
- $this->assertArrayHasKey('pageInfo', $node['translations']);
- $this->assertArrayHasKey('totalCount', $node['translations']);
- }
- /**
- * Get Attribute Options - Basic
- */
- public function test_get_attribute_options_basic(): void
- {
- $query = <<<'GQL'
- query getAttributeOptions($first: Int) {
- attributeOptions(first: $first) {
- edges {
- node {
- id
- _id
- adminName
- sortOrder
- swatchValue
- }
- }
- pageInfo {
- hasNextPage
- endCursor
- }
- }
- }
- GQL;
- $response = $this->graphQL($query, ['first' => 10]);
- $response->assertSuccessful();
- $data = $response->json('data.attributeOptions');
- $this->assertNotNull($data, 'attributeOptions response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributeOptions.edges is not an array');
- $this->assertArrayHasKey('pageInfo', $data);
- $this->assertArrayHasKey('hasNextPage', $data['pageInfo']);
- $this->assertArrayHasKey('endCursor', $data['pageInfo']);
- if (! empty($data['edges'])) {
- $first = $data['edges'][0]['node'] ?? null;
- $this->assertNotNull($first, 'first option node is null');
- $this->assertArrayHasKey('id', $first);
- $this->assertArrayHasKey('_id', $first);
- $this->assertArrayHasKey('adminName', $first);
- $this->assertArrayHasKey('sortOrder', $first);
- $this->assertArrayHasKey('swatchValue', $first);
- }
- }
- /**
- * Get Attribute Options with Translations
- */
- public function test_get_attribute_options_with_translations_basic(): void
- {
- $query = <<<'GQL'
- query getAttributeOptionsWithTranslations($first: Int) {
- attributeOptions(first: $first) {
- edges {
- node {
- id
- adminName
- sortOrder
- translations(first: 10) {
- edges {
- node {
- locale
- label
- }
- }
- }
- }
- }
- }
- }
- GQL;
- $response = $this->graphQL($query, ['first' => 5]);
- $response->assertSuccessful();
- $data = $response->json('data.attributeOptions');
- $this->assertNotNull($data, 'attributeOptions response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributeOptions.edges is not an array');
- if (! empty($data['edges'])) {
- $first = $data['edges'][0]['node'] ?? null;
- $this->assertNotNull($first, 'first option node is null');
- $this->assertArrayHasKey('id', $first);
- $this->assertArrayHasKey('adminName', $first);
- $this->assertArrayHasKey('sortOrder', $first);
- $this->assertArrayHasKey('translations', $first);
- $this->assertIsArray($first['translations']['edges'] ?? []);
- $transFirst = $first['translations']['edges'][0]['node'] ?? null;
- if ($transFirst) {
- $this->assertArrayHasKey('locale', $transFirst);
- $this->assertArrayHasKey('label', $transFirst);
- }
- }
- }
- /**
- * Get Attribute Options with Swatches
- */
- public function test_get_attribute_options_with_swatches_basic(): void
- {
- $query = <<<'GQL'
- query getSwatchOptions($first: Int) {
- attributeOptions(first: $first) {
- edges {
- node {
- id
- adminName
- swatchValue
- swatchValueUrl
- translation {
- locale
- label
- }
- }
- }
- }
- }
- GQL;
- $response = $this->graphQL($query, ['first' => 20]);
- $response->assertSuccessful();
- $data = $response->json('data.attributeOptions');
- $this->assertNotNull($data, 'attributeOptions response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributeOptions.edges is not an array');
- if (! empty($data['edges'])) {
- foreach ($data['edges'] as $edge) {
- $node = $edge['node'] ?? null;
- $this->assertNotNull($node, 'option node is null');
- $this->assertArrayHasKey('id', $node);
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('swatchValue', $node);
- $this->assertArrayHasKey('swatchValueUrl', $node);
- $this->assertArrayHasKey('translation', $node);
- $trans = $node['translation'] ?? null;
- if ($trans) {
- $this->assertArrayHasKey('locale', $trans);
- $this->assertArrayHasKey('label', $trans);
- }
- }
- }
- }
- /**
- * Get Single Attribute Option Detail By Option ID
- */
- public function test_get_single_attribute_option_by_id_basic(): void
- {
- $query = <<<'GQL'
- query getAttributeOptionByID ($id: ID!) {
- attributeOption (id: $id) {
- id
- _id
- adminName
- sortOrder
- swatchValue
- swatchValueUrl
- translation {
- id
- _id
- attributeOptionId
- locale
- label
- }
- translations {
- edges {
- node {
- id
- _id
- attributeOptionId
- locale
- label
- }
- }
- pageInfo {
- endCursor
- startCursor
- hasNextPage
- hasPreviousPage
- }
- totalCount
- }
- }
- }
- GQL;
- $variables = ['id' => '/api/admin/attribute_options/1'];
- $response = $this->graphQL($query, $variables);
- $response->assertSuccessful();
- $node = $response->json('data.attributeOption');
- $this->assertNotNull($node, 'attributeOption response is null');
- $this->assertArrayHasKey('id', $node);
- $this->assertArrayHasKey('_id', $node);
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('sortOrder', $node);
- $this->assertArrayHasKey('swatchValue', $node);
- $this->assertArrayHasKey('swatchValueUrl', $node);
- $this->assertArrayHasKey('translation', $node);
- $this->assertArrayHasKey('translations', $node);
- $this->assertIsArray($node['translations']['edges'] ?? []);
- $this->assertArrayHasKey('pageInfo', $node['translations']);
- $this->assertArrayHasKey('totalCount', $node['translations']);
- $this->assertArrayHasKey('endCursor', $node['translations']['pageInfo']);
- $this->assertArrayHasKey('startCursor', $node['translations']['pageInfo']);
- $this->assertArrayHasKey('hasNextPage', $node['translations']['pageInfo']);
- $this->assertArrayHasKey('hasPreviousPage', $node['translations']['pageInfo']);
- }
- /**
- * Get Attribute Options - Pagination
- */
- public function test_get_attribute_options_pagination_basic(): void
- {
- $query = <<<'GQL'
- query getAttributeOptionsPaginated(
- $first: Int
- $after: String
- ) {
- attributeOptions(
- first: $first
- after: $after
- ) {
- edges {
- node {
- id
- adminName
- sortOrder
- }
- cursor
- }
- pageInfo {
- hasNextPage
- endCursor
- hasPreviousPage
- startCursor
- }
- }
- }
- GQL;
- $variables = ['first' => 10, 'after' => null];
- $response = $this->graphQL($query, $variables);
- $response->assertSuccessful();
- $data = $response->json('data.attributeOptions');
- $this->assertNotNull($data, 'attributeOptions response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributeOptions.edges is not an array');
- $this->assertArrayHasKey('pageInfo', $data);
- $this->assertArrayHasKey('hasNextPage', $data['pageInfo']);
- $this->assertArrayHasKey('endCursor', $data['pageInfo']);
- $this->assertArrayHasKey('hasPreviousPage', $data['pageInfo']);
- $this->assertArrayHasKey('startCursor', $data['pageInfo']);
- if (! empty($data['edges'])) {
- $firstEdge = $data['edges'][0] ?? null;
- $this->assertNotNull($firstEdge, 'first edge is null');
- $this->assertArrayHasKey('node', $firstEdge);
- $this->assertArrayHasKey('cursor', $firstEdge);
- $node = $firstEdge['node'] ?? null;
- $this->assertNotNull($node, 'edge.node is null');
- $this->assertArrayHasKey('id', $node);
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('sortOrder', $node);
- }
- }
- /**
- * Get Attribute Options with Attribute
- */
- public function test_get_attribute_with_options_basic(): void
- {
- $query = <<<'GQL'
- query getAttribute($id: ID!, $first: Int) {
- attribute(id: $id) {
- id
- code
- adminName
- options(first: $first) {
- edges {
- node {
- id
- adminName
- sortOrder
- swatchValue
- translation {
- locale
- label
- }
- }
- cursor
- }
- pageInfo {
- hasNextPage
- endCursor
- }
- }
- }
- }
- GQL;
- $variables = ['id' => '/api/shop/attributes/23', 'first' => 10];
- $response = $this->graphQL($query, $variables);
- $response->assertSuccessful();
- $data = $response->json('data.attribute');
- $this->assertNotNull($data, 'attribute response is null');
- $this->assertArrayHasKey('id', $data);
- $this->assertArrayHasKey('code', $data);
- $this->assertArrayHasKey('adminName', $data);
- $this->assertArrayHasKey('options', $data);
- $this->assertIsArray($data['options']['edges'] ?? [], 'attribute.options.edges is not an array');
- $this->assertArrayHasKey('pageInfo', $data['options']);
- $this->assertArrayHasKey('hasNextPage', $data['options']['pageInfo']);
- $this->assertArrayHasKey('endCursor', $data['options']['pageInfo']);
- if (! empty($data['options']['edges'])) {
- $firstEdge = $data['options']['edges'][0] ?? null;
- $this->assertNotNull($firstEdge, 'first attribute option edge is null');
- $this->assertArrayHasKey('node', $firstEdge);
- $this->assertArrayHasKey('cursor', $firstEdge);
- $node = $firstEdge['node'] ?? null;
- $this->assertNotNull($node, 'option node is null');
- $this->assertArrayHasKey('id', $node);
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('sortOrder', $node);
- $this->assertArrayHasKey('swatchValue', $node);
- $this->assertArrayHasKey('translation', $node);
- $trans = $node['translation'] ?? null;
- if ($trans) {
- $this->assertArrayHasKey('locale', $trans);
- $this->assertArrayHasKey('label', $trans);
- }
- }
- }
- /**
- * Get Color Options for Display
- */
- public function test_get_color_options_for_display(): void
- {
- $query = <<<'GQL'
- query getColorOptions {
- attributeOptions(first: 50) {
- edges {
- node {
- adminName
- swatchValue
- translation {
- label
- }
- }
- }
- }
- }
- GQL;
- $response = $this->graphQL($query);
- $response->assertSuccessful();
- $data = $response->json('data.attributeOptions');
- $this->assertNotNull($data, 'attributeOptions response is null');
- $this->assertIsArray($data['edges'] ?? [], 'attributeOptions.edges is not an array');
- if (! empty($data['edges'])) {
- foreach ($data['edges'] as $edge) {
- $node = $edge['node'] ?? null;
- $this->assertNotNull($node, 'option node is null');
- $this->assertArrayHasKey('adminName', $node);
- $this->assertArrayHasKey('swatchValue', $node);
- $this->assertArrayHasKey('translation', $node);
- $trans = $node['translation'] ?? null;
- if ($trans) {
- $this->assertArrayHasKey('label', $trans);
- }
- }
- }
- }
- }
|