From 376cb6a1b848a15ca345fd6deab4af91133de60e Mon Sep 17 00:00:00 2001
From: Takumaru Sekine <54073-sekinet813@users.noreply.drupalcode.org>
Date: Mon, 6 Feb 2023 23:15:10 -0800
Subject: [PATCH] Issue #3338794 by sekinet, yas, Xiaohua Guan: Add test cases
 for OpenStack Heat Resource (Read)

---
 .../src/Service/OpenStackBatchOperations.php  |  2 +-
 .../src/Service/Rest/OpenStackService.php     |  1 +
 .../OpenStack/OpenStackStackTest.php          | 29 ++++++++++++-
 .../src/Traits/OpenStackTestFormDataTrait.php |  1 +
 .../src/Traits/OpenStackTestMockTrait.php     | 43 ++++++++++++++++++-
 5 files changed, 71 insertions(+), 5 deletions(-)

diff --git a/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php b/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php
index c465a78564..e708184d65 100644
--- a/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php
+++ b/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php
@@ -1251,7 +1251,7 @@ class OpenStackBatchOperations {
   public static function updateStackResource(string $cloud_context, array $resource): void {
     $timestamp = time();
     $name = $resource['Name'] ?? $resource['ResourceId'];
-    $uid = 0;
+    $uid = $resource['Uid'] ?? 0;
     $entity_id = \Drupal::service('cloud')->getEntityId($cloud_context, 'openstack_stack_resource', 'resource_id', $resource['ResourceId']);
 
     // Skip if $entity already exists, by updating 'refreshed' time.
diff --git a/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php b/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php
index f3f4172dee..d739756385 100644
--- a/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php
+++ b/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php
@@ -6215,6 +6215,7 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
         }
 
         $resource['StackEntityId'] = $stack->id();
+        $resource['Uid'] = $stack->getOwner();
 
         if ($batch_mode) {
           $batch_builder->addOperation([
diff --git a/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php b/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php
index 899e561c52..f167f8cb88 100644
--- a/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php
+++ b/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\openstack\Functional\OpenStack;
 
+use Drupal\Component\Serialization\Yaml;
+use Drupal\cloud\Service\CloudServiceInterface;
 use Drupal\openstack\Entity\OpenStackStack;
 use Drupal\Tests\openstack\Functional\OpenStackTestBase;
 
@@ -25,6 +27,7 @@ class OpenStackStackTest extends OpenStackTestBase {
       'view any openstack stack',
       'edit any openstack stack',
       'delete any openstack stack',
+      'list openstack stack resource',
     ];
   }
 
@@ -36,6 +39,7 @@ class OpenStackStackTest extends OpenStackTestBase {
   protected function getMockDataTemplateVars(): array {
     return [
       'stack_id' => 'eni-' . $this->getRandomId(),
+      'resource_id' => 'rni-' . $this->getRandomId(),
       'project_id' => $this->cloudConfig->get('field_project_id')->value,
       'create_time' => date('c'),
     ];
@@ -54,20 +58,32 @@ class OpenStackStackTest extends OpenStackTestBase {
     $this->drupalGet("/clouds/openstack/$cloud_context/stack");
     $this->assertNoErrorMessage();
 
+    $cloud_service_mock = $this->createMock(CloudServiceInterface::class);
+
     // Add a new stack.
     $add = $this->createStackTestFormData(self::OPENSTACK_STACK_REPEAT_COUNT);
     $add_extra = $this->createStackTestExtraFormData(self::OPENSTACK_STACK_REPEAT_COUNT);
     for ($i = 0, $num = 1; $i < self::OPENSTACK_STACK_REPEAT_COUNT; $i++, $num++) {
       $mock_data = array_merge_recursive($add[$i], $add_extra[$i]);
-      $this->addStackMockData($mock_data, $cloud_context, $this->webUser->id());
+      $conditions = [];
+      $conditions['stack_id'] = $mock_data['stack_id'];
+      $cloud_service_mock->expects($this->any())
+        ->method('loadAllEntities')
+        ->with($cloud_context, 'openstack_stack', $conditions)
+        ->willReturnMap([$mock_data]);
+      $this->addStackMockData($mock_data, $cloud_context, $this->webUser->id(), $num);
       $this->showStackMockData($mock_data, $cloud_context, $this->webUser->id());
-
+      $this->addStackResourceMockData($mock_data, $this->webUser->id(), $num);
       $this->drupalGet("/clouds/openstack/$cloud_context/stack/add");
       $this->submitForm(
         $add[$i],
         $this->t('Next')
       );
 
+      unset(
+        $add_extra[$i]['stack_id']
+      );
+
       $this->submitForm(
         $add_extra[$i],
         $this->t('Save')
@@ -94,6 +110,11 @@ class OpenStackStackTest extends OpenStackTestBase {
       $this->assertSession()->pageTextContains($this->webUser->getAccountName());
       // Make sure stack status.
       $this->assertSession()->pageTextContains('CREATE_COMPLETE');
+
+      $template_data = Yaml::decode($add[$i]['template_data']);
+      foreach ($template_data['resources'] ?: [] as $name => $resource) {
+        $this->assertSession()->pageTextContains($name);
+      }
     }
 
     for ($i = 0, $num = 1; $i < self::OPENSTACK_STACK_REPEAT_COUNT; $i++, $num++) {
@@ -118,6 +139,10 @@ class OpenStackStackTest extends OpenStackTestBase {
         $this->t('Next')
       );
 
+      unset(
+        $edit_extra[$i]['stack_id']
+      );
+
       $this->submitForm(
         $edit_extra[$i],
         $this->t('Save')
diff --git a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php
index c67f9b9479..099ad675a5 100644
--- a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php
+++ b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php
@@ -733,6 +733,7 @@ EOS;
 
     for ($i = 0, $num = 1; $i < $repeat_count; $i++, $num++) {
       $data[$i] = [
+        'stack_id' => "stack-{$this->getRandomId()}",
         'name' => "stack-name-$num-{$this->random->name(8, TRUE)}",
         'timeout_mins' => 60,
       ];
diff --git a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php
index 71a844f57c..064c7c5e18 100644
--- a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php
+++ b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php
@@ -953,10 +953,10 @@ trait OpenStackTestMockTrait {
     $mock_data = $this->getMockDataFromConfig();
     $vars = $this->getMockDataTemplateVars();
 
-    $mock_data['CreateStack']['Stack']['StackId'] = $vars['stack_id'];
+    $mock_data['CreateStack']['Stack']['StackId'] = $data['stack_id'];
 
     $stack = [
-      'StackId' => $vars['stack_id'],
+      'StackId' => $data['stack_id'],
       'Name' => $data['name'],
       'ProjectId' => $vars['project_id'],
       'TimeoutMins' => 60,
@@ -976,6 +976,45 @@ trait OpenStackTestMockTrait {
     $this->updateMockDataToConfig($mock_data);
   }
 
+  /**
+   * Add Stack resource mock data.
+   *
+   * @param array $data
+   *   Array of stack data.
+   * @param int $uid
+   *   The uid.
+   * @param int $stack_entity_id
+   *   The stack entity id.
+   *
+   * @throws \Exception
+   */
+  protected function addStackResourceMockData(
+    array $data,
+    int $uid = 0,
+    int $stack_entity_id = 0
+  ): void {
+    $mock_data = $this->getMockDataFromConfig();
+    $vars = $this->getMockDataTemplateVars();
+
+    $resource = [
+      'ResourceId' => 'resource-' . $this->getRandomId(),
+      'Name' => 'sample_net',
+      'ProjectId' => $vars['project_id'],
+      'StackId' => $data['stack_id'],
+      'StackName' => $data['name'],
+      'StackEntityId' => $stack_entity_id,
+      'ResourceStatus' => 'CREATE_COMPLETE',
+      'ResourceStatusReason' => 'state changed',
+      'ResourceType' => 'OS::Neutron::Net',
+      'CreationTime' => $vars['create_time'],
+      'UpdatedTime' => $vars['create_time'],
+      'Uid' => $uid,
+    ];
+
+    $mock_data['describeStackResources']['Resources'][] = $resource;
+    $this->updateMockDataToConfig($mock_data);
+  }
+
   /**
    * Update Stack mock data.
    *
-- 
GitLab