From 1aca2f1f592a4a1f689347ce33b03cf043f79a33 Mon Sep 17 00:00:00 2001
From: Sebastian Poxhofer <secustor@users.noreply.github.com>
Date: Sun, 4 Dec 2022 17:41:19 +0100
Subject: [PATCH] test(terraform): further improve testing and simplify test
 code (#19242)

---
 .../__snapshots__/extract.spec.ts.snap        | 126 ----------------
 lib/modules/manager/terraform/extract.spec.ts | 141 ++++++++++++++++--
 .../manager/terraform/lockfile/index.spec.ts  |  37 ++++-
 .../manager/terraform/lockfile/util.spec.ts   |  62 ++++++++
 4 files changed, 223 insertions(+), 143 deletions(-)
 delete mode 100644 lib/modules/manager/terraform/__snapshots__/extract.spec.ts.snap

diff --git a/lib/modules/manager/terraform/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/terraform/__snapshots__/extract.spec.ts.snap
deleted file mode 100644
index cf5bf64e23..0000000000
--- a/lib/modules/manager/terraform/__snapshots__/extract.spec.ts.snap
+++ /dev/null
@@ -1,126 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`modules/manager/terraform/extract extractPackageFile() extracts  modules 1`] = `
-{
-  "deps": [
-    {
-      "currentValue": "v1.0.0",
-      "datasource": "github-tags",
-      "depName": "github.com/hashicorp/example",
-      "depType": "module",
-      "packageName": "hashicorp/example",
-    },
-    {
-      "currentValue": "next",
-      "datasource": "github-tags",
-      "depName": "github.com/hashicorp/example",
-      "depType": "module",
-      "packageName": "hashicorp/example",
-    },
-    {
-      "currentValue": "tfmodule_one-v0.0.9",
-      "datasource": "github-tags",
-      "depName": "github.com/githubuser/myrepo",
-      "depType": "module",
-      "packageName": "githubuser/myrepo",
-    },
-    {
-      "currentValue": "v1.0.0",
-      "datasource": "github-tags",
-      "depName": "github.com/hashicorp/example.2.3",
-      "depType": "module",
-      "packageName": "hashicorp/example.2.3",
-    },
-    {
-      "currentValue": "v1.0.0",
-      "datasource": "github-tags",
-      "depName": "github.com/hashicorp/example.2.3",
-      "depType": "module",
-      "packageName": "hashicorp/example.2.3",
-    },
-    {
-      "currentValue": "0.1.0",
-      "datasource": "terraform-module",
-      "depName": "hashicorp/consul/aws",
-      "depType": "module",
-    },
-    {
-      "currentValue": "v2.0.0",
-      "datasource": "github-tags",
-      "depName": "github.com/hashicorp/example",
-      "depType": "module",
-      "packageName": "hashicorp/example",
-    },
-    {
-      "currentValue": "~> 1.1.0",
-      "datasource": "terraform-module",
-      "depName": "app.terraform.io/example-corp/k8s-cluster/azurerm",
-      "depType": "module",
-      "registryUrls": [
-        "https://app.terraform.io",
-      ],
-    },
-    {
-      "currentValue": "~> 1.1",
-      "datasource": "terraform-module",
-      "depName": "app.terraform.io/example-corp/k8s-cluster/azurerm",
-      "depType": "module",
-      "registryUrls": [
-        "https://app.terraform.io",
-      ],
-    },
-    {
-      "currentValue": "~~ 1.1",
-      "datasource": "terraform-module",
-      "depName": "app.terraform.io/example-corp/k8s-cluster/azurerm",
-      "depType": "module",
-      "registryUrls": [
-        "https://app.terraform.io",
-      ],
-    },
-    {
-      "currentValue": ">= 1.0.0, <= 2.0.0",
-      "datasource": "terraform-module",
-      "depName": "hashicorp/consul/aws",
-      "depType": "module",
-    },
-    {
-      "currentValue": "v0.1.0",
-      "datasource": "github-tags",
-      "depName": "github.com/tieto-cem/terraform-aws-ecs-task-definition",
-      "depType": "module",
-      "packageName": "tieto-cem/terraform-aws-ecs-task-definition",
-    },
-    {
-      "currentValue": "v0.1.0",
-      "datasource": "github-tags",
-      "depName": "github.com/tieto-cem/terraform-aws-ecs-task-definition",
-      "depType": "module",
-      "packageName": "tieto-cem/terraform-aws-ecs-task-definition",
-    },
-    {
-      "datasource": "terraform-module",
-      "depName": "terraform-aws-modules/security-group/aws",
-      "depType": "module",
-    },
-    {
-      "currentValue": "<= 2.4.0",
-      "datasource": "terraform-module",
-      "depName": "terraform-aws-modules/security-group/aws",
-      "depType": "module",
-    },
-    {
-      "currentValue": "1.28.3",
-      "datasource": "terraform-module",
-      "depName": "particuleio/addons/kubernetes",
-      "depType": "module",
-    },
-    {
-      "skipReason": "local",
-    },
-    {
-      "skipReason": "no-source",
-    },
-  ],
-}
-`;
diff --git a/lib/modules/manager/terraform/extract.spec.ts b/lib/modules/manager/terraform/extract.spec.ts
index b7d5c78d03..db4463d4d5 100644
--- a/lib/modules/manager/terraform/extract.spec.ts
+++ b/lib/modules/manager/terraform/extract.spec.ts
@@ -43,14 +43,134 @@ describe('modules/manager/terraform/extract', () => {
       const res = await extractPackageFile(modules, 'modules.tf', {});
       expect(res?.deps).toHaveLength(18);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(2);
-      expect(res).toMatchSnapshot();
+      expect(res?.deps).toIncludeAllPartialMembers([
+        {
+          packageName: 'hashicorp/example',
+          depType: 'module',
+          depName: 'github.com/hashicorp/example',
+          currentValue: 'next',
+          datasource: 'github-tags',
+        },
+        {
+          packageName: 'hashicorp/example',
+          depType: 'module',
+          depName: 'github.com/hashicorp/example',
+          currentValue: 'v1.0.0',
+          datasource: 'github-tags',
+        },
+        {
+          packageName: 'hashicorp/example',
+          depType: 'module',
+          depName: 'github.com/hashicorp/example',
+          currentValue: 'next',
+          datasource: 'github-tags',
+        },
+        {
+          packageName: 'githubuser/myrepo',
+          depType: 'module',
+          depName: 'github.com/githubuser/myrepo',
+          currentValue: 'tfmodule_one-v0.0.9',
+          datasource: 'github-tags',
+        },
+        {
+          packageName: 'hashicorp/example.2.3',
+          depType: 'module',
+          depName: 'github.com/hashicorp/example.2.3',
+          currentValue: 'v1.0.0',
+          datasource: 'github-tags',
+        },
+        {
+          packageName: 'hashicorp/example.2.3',
+          depType: 'module',
+          depName: 'github.com/hashicorp/example.2.3',
+          currentValue: 'v1.0.0',
+          datasource: 'github-tags',
+        },
+        {
+          currentValue: '0.1.0',
+          depType: 'module',
+          depName: 'hashicorp/consul/aws',
+          datasource: 'terraform-module',
+        },
+        {
+          packageName: 'hashicorp/example',
+          depType: 'module',
+          depName: 'github.com/hashicorp/example',
+          currentValue: 'v2.0.0',
+          datasource: 'github-tags',
+        },
+        {
+          currentValue: '~> 1.1.0',
+          registryUrls: ['https://app.terraform.io'],
+          depType: 'module',
+          depName: 'app.terraform.io/example-corp/k8s-cluster/azurerm',
+          datasource: 'terraform-module',
+        },
+        {
+          currentValue: '~> 1.1',
+          registryUrls: ['https://app.terraform.io'],
+          depType: 'module',
+          depName: 'app.terraform.io/example-corp/k8s-cluster/azurerm',
+          datasource: 'terraform-module',
+        },
+        {
+          currentValue: '~~ 1.1',
+          registryUrls: ['https://app.terraform.io'],
+          depType: 'module',
+          depName: 'app.terraform.io/example-corp/k8s-cluster/azurerm',
+          datasource: 'terraform-module',
+        },
+        {
+          currentValue: '>= 1.0.0, <= 2.0.0',
+          depType: 'module',
+          depName: 'hashicorp/consul/aws',
+          datasource: 'terraform-module',
+        },
+        {
+          packageName: 'tieto-cem/terraform-aws-ecs-task-definition',
+          depType: 'module',
+          depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition',
+          currentValue: 'v0.1.0',
+          datasource: 'github-tags',
+        },
+        {
+          packageName: 'tieto-cem/terraform-aws-ecs-task-definition',
+          depType: 'module',
+          depName: 'github.com/tieto-cem/terraform-aws-ecs-task-definition',
+          currentValue: 'v0.1.0',
+          datasource: 'github-tags',
+        },
+        {
+          depType: 'module',
+          depName: 'terraform-aws-modules/security-group/aws',
+          datasource: 'terraform-module',
+        },
+        {
+          currentValue: '<= 2.4.0',
+          depType: 'module',
+          depName: 'terraform-aws-modules/security-group/aws',
+          datasource: 'terraform-module',
+        },
+        {
+          currentValue: '1.28.3',
+          depType: 'module',
+          depName: 'particuleio/addons/kubernetes',
+          datasource: 'terraform-module',
+        },
+        {
+          skipReason: 'local',
+        },
+        {
+          skipReason: 'no-source',
+        },
+      ]);
     });
 
     it('extracts bitbucket modules', async () => {
       const res = await extractPackageFile(bitbucketModules, 'modules.tf', {});
       expect(res?.deps).toHaveLength(11);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(0);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: 'v1.0.0',
           datasource: 'git-tags',
@@ -137,7 +257,8 @@ describe('modules/manager/terraform/extract', () => {
         'modules.tf',
         {}
       );
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toHaveLength(3);
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: 'v1.0.0',
           datasource: 'git-tags',
@@ -166,7 +287,7 @@ describe('modules/manager/terraform/extract', () => {
       const res = await extractPackageFile(providers, 'providers.tf', {});
       expect(res?.deps).toHaveLength(15);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(2);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: '1.36.1',
           datasource: 'terraform-provider',
@@ -282,7 +403,7 @@ describe('modules/manager/terraform/extract', () => {
       const res = await extractPackageFile(docker, 'docker.tf', {});
       expect(res?.deps).toHaveLength(8);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(5);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           autoReplaceStringTemplate:
             '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
@@ -338,7 +459,7 @@ describe('modules/manager/terraform/extract', () => {
       const res = await extractPackageFile(kubernetes, 'kubernetes.tf', {});
       expect(res?.deps).toHaveLength(18);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(1);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           depName: 'gcr.io/kaniko-project/executor',
           currentValue: 'v1.7.0',
@@ -445,7 +566,7 @@ describe('modules/manager/terraform/extract', () => {
       const res = await extractPackageFile(helm, 'helm.tf', {});
       expect(res?.deps).toHaveLength(6);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(2);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: '1.0.1',
           datasource: 'helm',
@@ -502,7 +623,7 @@ describe('modules/manager/terraform/extract', () => {
       );
       expect(res?.deps).toHaveLength(3);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(0);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: '~> 3.0',
           datasource: 'terraform-provider',
@@ -538,7 +659,7 @@ describe('modules/manager/terraform/extract', () => {
       );
       expect(res?.deps).toHaveLength(1);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(0);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: '1.0.0',
           datasource: 'github-releases',
@@ -557,7 +678,7 @@ describe('modules/manager/terraform/extract', () => {
       );
       expect(res?.deps).toHaveLength(3);
       expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(1);
-      expect(res?.deps.sort()).toMatchObject([
+      expect(res?.deps).toIncludeAllPartialMembers([
         {
           currentValue: '1.1.6',
           datasource: 'github-releases',
diff --git a/lib/modules/manager/terraform/lockfile/index.spec.ts b/lib/modules/manager/terraform/lockfile/index.spec.ts
index 7b709d51d5..5294f00725 100644
--- a/lib/modules/manager/terraform/lockfile/index.spec.ts
+++ b/lib/modules/manager/terraform/lockfile/index.spec.ts
@@ -90,7 +90,10 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).not.toBeNull();
     expect(result).toBeArrayOfSize(1);
     expect(result?.[0].file).not.toBeNull();
-    expect(result?.[0].file).toMatchSnapshot();
+    expect(result?.[0].file).toMatchSnapshot({
+      type: 'addition',
+      path: '.terraform.lock.hcl',
+    });
 
     expect(mockHash.mock.calls).toBeArrayOfSize(1);
     expect(mockHash.mock.calls).toMatchSnapshot();
@@ -122,7 +125,10 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).not.toBeNull();
     expect(result).toBeArrayOfSize(1);
     expect(result?.[0].file).not.toBeNull();
-    expect(result?.[0].file).toMatchSnapshot();
+    expect(result?.[0].file).toMatchSnapshot({
+      type: 'addition',
+      path: '.terraform.lock.hcl',
+    });
 
     expect(mockHash.mock.calls).toBeArrayOfSize(1);
     expect(mockHash.mock.calls).toMatchSnapshot();
@@ -173,7 +179,10 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).not.toBeNull();
     expect(result).toBeArrayOfSize(1);
     expect(result?.[0].file).not.toBeNull();
-    expect(result?.[0].file).toMatchSnapshot();
+    expect(result?.[0].file).toMatchSnapshot({
+      type: 'addition',
+      path: '.terraform.lock.hcl',
+    });
 
     expect(mockHash.mock.calls).toBeArrayOfSize(1);
     expect(mockHash.mock.calls).toMatchSnapshot();
@@ -205,7 +214,10 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).not.toBeNull();
     expect(result).toBeArrayOfSize(1);
     expect(result?.[0].file).not.toBeNull();
-    expect(result?.[0].file).toMatchSnapshot();
+    expect(result?.[0].file).toMatchSnapshot({
+      type: 'addition',
+      path: '.terraform.lock.hcl',
+    });
 
     expect(mockHash.mock.calls).toBeArrayOfSize(1);
     expect(mockHash.mock.calls).toMatchSnapshot();
@@ -237,7 +249,10 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).not.toBeNull();
     expect(result).toBeArrayOfSize(1);
     expect(result?.[0].file).not.toBeNull();
-    expect(result?.[0].file).toMatchSnapshot();
+    expect(result?.[0].file).toMatchSnapshot({
+      type: 'addition',
+      path: 'test/.terraform.lock.hcl',
+    });
 
     expect(mockHash.mock.calls).toBeArrayOfSize(1);
     expect(mockHash.mock.calls).toMatchSnapshot();
@@ -290,7 +305,10 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).not.toBeNull();
     expect(result).toBeArrayOfSize(1);
     expect(result?.[0].file).not.toBeNull();
-    expect(result?.[0].file).toMatchSnapshot();
+    expect(result?.[0].file).toMatchSnapshot({
+      type: 'addition',
+      path: 'test/.terraform.lock.hcl',
+    });
 
     expect(mockHash.mock.calls).toBeArrayOfSize(4);
     expect(mockHash.mock.calls).toMatchSnapshot();
@@ -436,7 +454,12 @@ describe('modules/manager/terraform/lockfile/index', () => {
     expect(result).toBeArrayOfSize(1);
 
     result?.forEach((value) => expect(value.file).not.toBeNull());
-    result?.forEach((value) => expect(value.file).toMatchSnapshot());
+    result?.forEach((value) =>
+      expect(value.file).toMatchSnapshot({
+        type: 'addition',
+        path: 'subfolder/.terraform.lock.hcl',
+      })
+    );
 
     expect(mockHash.mock.calls).toBeArrayOfSize(2);
     expect(mockHash.mock.calls).toMatchSnapshot();
diff --git a/lib/modules/manager/terraform/lockfile/util.spec.ts b/lib/modules/manager/terraform/lockfile/util.spec.ts
index 91a124b5dc..8e20c95700 100644
--- a/lib/modules/manager/terraform/lockfile/util.spec.ts
+++ b/lib/modules/manager/terraform/lockfile/util.spec.ts
@@ -11,6 +11,68 @@ describe('modules/manager/terraform/lockfile/util', () => {
     it('extracts', () => {
       const res = extractLocks(Fixtures.get('validLockfile.hcl'));
       expect(res).toHaveLength(3);
+      expect(res).toIncludeAllPartialMembers([
+        {
+          packageName: 'hashicorp/aws',
+          registryUrl: 'https://registry.terraform.io',
+          version: '3.0.0',
+          constraints: '3.0.0',
+          hashes: [
+            'h1:ULKfwySvQ4pDhy027ryRhLxDhg640wsojYc+7NHMFBU=',
+            'zh:25294510ae9c250502f2e37ac32b01017439735f098f82a1728772427626a2fd',
+            'zh:3b723e7772d47bd8cc11bea6e5d3e0b5e1df8398c0e7aaf510e3a8a54e0f1874',
+            'zh:4b7b73b86f4a0705d5d2a7f1d3ad3279706bdb3957a48f4a389c36918fba838e',
+            'zh:9e26cdc3be97e3001c253c0ca28c5c8ff2d5476373ca1beb849f3f3957ce7f1a',
+            'zh:9e73cf1304bf57968d3048d70c0b766d41497430a2a9a7a718a196f3a385106a',
+            'zh:a30b5b66facfbb2b02814e4cd33ca9899f9ade5bbf478f78c41d2fe789f0582a',
+            'zh:b06fb5da094db41cb5e430c95c988b73f32695e9f90f25499e926842dbd21b21',
+            'zh:c5a4ff607e9e9edee3fcd6d6666241fb532adf88ea1fe24f2aa1eb36845b3ca3',
+            'zh:df568a69087831c1780fac4395630a2cfb3cdf67b7dffbfe16bd78c64770bb75',
+            'zh:fce1b69dd673aace19508640b0b9b7eb1ef7e746d76cb846b49e7d52e0f5fb7e',
+          ],
+        },
+        {
+          packageName: 'hashicorp/azurerm',
+          registryUrl: 'https://registry.terraform.io',
+          version: '2.50.0',
+          constraints: '~> 2.50',
+          hashes: [
+            'h1:Vr6WUm88s9hXGkyVjHtHsP2Jmc2ypQXn6ww7dXtvk1M=',
+            'zh:0c0688d5a743248f8646d39eb3645a4ac19fd7523ba1b47072fa3fb03b92b1b0',
+            'zh:2beb3a55ee970f87a9292ae96d57134be8a03d0566117e7be0fe0d9c1267e4ea',
+            'zh:38091b463fbafe5756420ce34c87845c2a391fec0cded27bdcbbca28febad382',
+            'zh:4ba455da3b37ba8f8b03ff2781121d9c54d0bd8afd76dfe67593011c475dd73f',
+            'zh:5d32b9ed871b3c3b774dc69f1fe14cdf7c1fd63d12bb5f21aad4bfbf75e5ee3d',
+            'zh:6c80cf90a3fc1e17d9caf67cc558c2ff91f8b25e29fdf00942f67711895be5c0',
+            'zh:c0a53e3165407999d10de7aaa983485d42797433c60b5775791ae299121279ed',
+            'zh:dab51d6d76041505aeebf20111febe8616ec465ca31dfb7901f5f5c23a5af095',
+            'zh:e1ad6399f6a6d799002206ee4cb7b794dbb2533b8c3c14502a4419955ec96bff',
+            'zh:e98f1d178d1e111b3f3449e27d305ce263071226fad3d86272e1bd161c26fd43',
+            'zh:eb76ec000c9c49a0bf730370c8880f671597bc01f7b7401ab301df7124c049ec',
+          ],
+        },
+        {
+          packageName: 'hashicorp/random',
+          registryUrl: 'https://registry.terraform.io',
+          version: '2.2.1',
+          constraints: '~> 2.2',
+          hashes: [
+            'h1:Zg1Bpi6vr7b0H6no8kVDfEucn5pvNALivdrVKVHarGs=',
+            'zh:072ce92b0138ee65df2e4e2e6e5f6632fa12a7e6453b91399bad89291855d426',
+            'zh:5731987fe61051515f449033e456ee55207caf17ef41096eb82247810585f53b',
+            'zh:6f18b10175708bb5839e1f2082dcc02651b876786cd54ec415a091f3821807c3',
+            'zh:7fa7737661380d18cba3cdc71c4ec6f2fd281b9d61112f6b48d06ca8bbf97771',
+            'zh:8466cb8fbb4de887b23039082a6e3dc85aeabce86dd808e2a7a65e4e1c51dbae',
+            'zh:888c63417701c13bbe785ab11dc690d4803e6a2156318cf188970b7b6400b99e',
+            'zh:a231df55d36fbad1a6705f5d3be4f7459a73ec76117d13f22aa83c10fc610278',
+            'zh:b62d9a4cd64a2d229070260f4abfef476ebbd7c5511b43e9cdccf23ce938f630',
+            'zh:b6bd1a325f909bb93f7c9bef00eb306bef1e406cbdf557901d755a3e7a4a5448',
+            'zh:b9f59afc23cc5567075f76313214baa1e5ce909325229e23c9a4666f7b26e7f7',
+            'zh:d040220c09b8d9d6bd937572bd5b14bc069af2b883185a873460530d8a1de6e6',
+            'zh:f254c1f943eb016ae07ebe91b23f813dc79f2064616c65f98c8f64ce23be90c4',
+          ],
+        },
+      ]);
       expect(res).toMatchSnapshot();
     });
   });
-- 
GitLab