import { getDigest, getPkgReleases } from '..';
import { ForgejoReleasesDatasource } from '.';
import * as httpMock from '~test/http-mock';

const datasource = ForgejoReleasesDatasource.id;

describe('modules/datasource/forgejo-releases/index', () => {
  describe('getReleases', () => {
    it('returns tags from forgejo.com', async () => {
      const body = [
        {
          id: 266974,
          tag_name: 'v9.2.1',
          target_commitish: 'main',
          name: 'v9.2.1',
          body: 'Fix a helm template check preventing from scaling up to more than one replica (#488)',
          url: 'https://code.forgejo.org/forgejo-helm/forgejo-helm/releases/266974',
          html_url:
            'https://code.forgejo.org/forgejo/helm-chart/releases/tag/v9.2.1',
          tarball_url:
            'https://code.forgejo.org/forgejo/helm-chart/archive/v9.2.1.tar.gz',
          zipball_url:
            'https://code.forgejo.org/forgejo/helm-chart/archive/v9.2.1.zip',
          upload_url:
            'https://code.forgejo.org/forgejo-helm/forgejo-helm/releases/266974/assets',
          draft: false,
          prerelease: false,
          created_at: '2023-08-27T12:56:50Z',
          published_at: '2023-08-27T12:56:50Z',
        },
        {
          id: 265923,
          tag_name: 'v9.2.0',
          target_commitish: 'main',
          name: 'v9.2.0',
          body: 'Bump to Forgejo 1.20.3\r\n\r\nFull changes found here: https://code.forgejo.org/forgejo/helm-chart/compare/v9.1.0...v9.2.0',
          url: 'https://code.forgejo.org/forgejo-helm/forgejo-helm/releases/265923',
          html_url:
            'https://code.forgejo.org/forgejo/helm-chart/releases/tag/v9.2.0',
          tarball_url:
            'https://code.forgejo.org/forgejo/helm-chart/archive/v9.2.0.tar.gz',
          zipball_url:
            'https://code.forgejo.org/forgejo-helm/forgejo-helm/archive/v13.0.0.zip',
          upload_url:
            'https://code.forgejo.org/forgejo-helm/forgejo-helm/releases/265923/assets',
          draft: false,
          prerelease: false,
          created_at: '2023-08-21T16:27:30Z',
          published_at: '2023-08-21T16:27:30Z',
        },
        {
          id: 263748,
          tag_name: 'v9.1.0',
          target_commitish: 'main',
          name: 'v9.1.0',
          body: 'Bump to Forgejo 1.20.2',
          url: 'https://code.forgejo.org/forgejo-helm/forgejo-helm/releases/263748',
          html_url:
            'https://code.forgejo.org/forgejo/helm-chart/releases/tag/v9.1.0',
          tarball_url:
            'https://code.forgejo.org/forgejo/helm-chart/archive/v9.1.0.tar.gz',
          zipball_url:
            'https://code.forgejo.org/forgejo/helm-chart/archive/v9.1.0.zip',
          upload_url:
            'https://code.forgejo.org/forgejo-helm/forgejo-helm/releases/263748/assets',
          draft: false,
          prerelease: false,
          created_at: '2023-07-31T07:04:49Z',
          published_at: '2023-07-31T07:04:49Z',
        },
      ];
      httpMock
        .scope('https://code.forgejo.org')
        .get('/api/v1/repos/forgejo/helm-chart/releases?draft=false')
        .reply(200, body);
      const res = await getPkgReleases({
        datasource,
        packageName: 'forgejo/helm-chart',
      });
      expect(res).toEqual({
        registryUrl: 'https://code.forgejo.org',
        releases: [
          {
            gitRef: 'v9.1.0',
            isStable: true,
            releaseTimestamp: '2023-07-31T07:04:49.000Z',
            version: 'v9.1.0',
          },
          {
            gitRef: 'v9.2.0',
            isStable: true,
            releaseTimestamp: '2023-08-21T16:27:30.000Z',
            version: 'v9.2.0',
          },
          {
            gitRef: 'v9.2.1',
            isStable: true,
            releaseTimestamp: '2023-08-27T12:56:50.000Z',
            version: 'v9.2.1',
          },
        ],
        sourceUrl: 'https://code.forgejo.org/forgejo/helm-chart',
      });
    });

    it('returns tags from codeberg.org', async () => {
      const body = [
        {
          id: 1585652,
          tag_name: '0.11.0',
          target_commitish: 'main',
          name: '0.11.0',
          body: '### ⚠ BREAKING CHANGES\r\n\r\n* **deps:** Forgejo breaking changes in [`v1.20.3-0`](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#1-20-3-0)\r\n\r\n### Bug Fixes\r\n\r\n* **deps:** update forgejo docker tag to v1.20.3-0 ([#178](https://codeberg.org/forgejo-contrib/forgejo-helm/issues/178)) ([523395a](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/523395a08688f13e301af60c4cba2b22a2baee10))\r\n* **deps:** update helm release memcached to v6.5.7 ([f1ce20e](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/f1ce20e593655fcd6c72393eaf8d47b2c199e996))\r\n* **deps:** update helm release memcached to v6.5.8 ([c2e51de](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/c2e51defc01122aa2d6684d8707b159015257f50))\r\n* **deps:** update helm release memcached to v6.5.9 ([0fbb232](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/0fbb2329f872e77e89d711ff1a95a250d87e5707))\r\n* **deps:** update helm release memcached to v6.6.0 ([#180](https://codeberg.org/forgejo-contrib/forgejo-helm/issues/180)) ([f19d22c](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/f19d22c6643b4643c4b2e96482b07527c84d2106))\r\n* **deps:** update helm release postgresql to v12.9.0 ([#174](https://codeberg.org/forgejo-contrib/forgejo-helm/issues/174)) ([7eb7edc](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/7eb7edcfd00ffab9dddbae9e9b2deace305c9a84))\r\n\r\n\r\n### Continuous Integration\r\n\r\n* **deps:** update alpine docker tag to v3.18.3 ([4a3717e](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/4a3717e12b65289a6d957e3a9c8921111c4f9013))\r\n\r\n',
          url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/releases/1585652',
          html_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/releases/tag/0.11.0',
          tarball_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/archive/0.11.0.tar.gz',
          zipball_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/archive/0.11.0.zip',
          draft: false,
          prerelease: false,
          created_at: '2023-08-25T08:27:19Z',
          published_at: '2023-08-25T08:27:19Z',
          assets: [
            {
              id: 55122,
              name: 'forgejo-0.11.0.tgz',
              size: 644676,
              download_count: 0,
              created_at: '2023-08-25T08:27:56Z',
              uuid: '49cc9743-6647-49a8-b27f-d292bd2956a4',
              browser_download_url:
                'https://codeberg.org/forgejo-contrib/forgejo-helm/releases/download/0.11.0/forgejo-0.11.0.tgz',
            },
          ],
        },
        {
          id: 1549992,
          tag_name: 'v0.10.1',
          target_commitish: 'main',
          name: '0.10.1',
          body: '\n\n### Bug Fixes\n\n* **deps:** update forgejo docker tag to v1.20.2-0 ([#171](https://codeberg.org/forgejo-contrib/forgejo-helm/issues/171)) ([ecd9b53](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/ecd9b535a128d4e6d643fde37bb05cd751b8d9f4))\n\n\n### Miscellaneous Chores\n\n* **deps:** update dependency @bitnami/readme-generator-for-helm to v2.5.1 ([b6a58fd](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/b6a58fd997ef8da358cbff3394cb755c548405fb))\n\n\n### Continuous Integration\n\n* **deps:** update dependency helm-unittest to v0.3.4 ([#173](https://codeberg.org/forgejo-contrib/forgejo-helm/issues/173)) ([dedab02](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/dedab02cab1be0f9c5ad8218a4e89622e0c603bf))\n\n',
          url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/releases/1549992',
          html_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/releases/tag/v0.10.1',
          tarball_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/archive/v0.10.1.tar.gz',
          zipball_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/archive/v0.10.1.zip',
          draft: false,
          prerelease: false,
          created_at: '2023-08-02T20:31:19Z',
          published_at: '2023-08-02T20:31:19Z',
          assets: [
            {
              id: 49902,
              name: 'forgejo-0.10.1.tgz',
              size: 637452,
              download_count: 3,
              created_at: '2023-08-02T20:33:45Z',
              uuid: '625ce014-0186-442a-94a6-6897ecbc8146',
              browser_download_url:
                'https://codeberg.org/forgejo-contrib/forgejo-helm/releases/download/v0.10.1/forgejo-0.10.1.tgz',
            },
          ],
        },
        {
          id: 1533110,
          tag_name: 'v0.10.0',
          target_commitish: 'main',
          name: '0.10.0',
          body: '\r\n### ⚠ BREAKING CHANGES\r\n\r\n* **deps:** Forgejo minor update\r\n\r\n### Features\r\n\r\n* **deps:** update forgejo docker tag to v1.20.1-0 ([#167](https://codeberg.org/forgejo-contrib/forgejo-helm/issues/167)) ([5677cf3](https://codeberg.org/forgejo-contrib/forgejo-helm/commit/5677cf39d4818da26931783a3438a660ae5f427d))\r\n\r\n',
          url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/releases/1533110',
          html_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/releases/tag/v0.10.0',
          tarball_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/archive/v0.10.0.tar.gz',
          zipball_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/archive/v0.10.0.zip',
          draft: false,
          prerelease: false,
          created_at: '2023-07-27T06:19:02Z',
          published_at: '2023-07-27T06:19:02Z',
          assets: [
            {
              id: 49376,
              name: 'forgejo-0.10.0.tgz',
              size: 635784,
              download_count: 1,
              created_at: '2023-07-27T06:19:51Z',
              uuid: '6aa68976-8510-4657-b144-74023e74f06c',
              browser_download_url:
                'https://codeberg.org/forgejo-contrib/forgejo-helm/releases/download/v0.10.0/forgejo-0.10.0.tgz',
            },
          ],
        },
      ];
      httpMock
        .scope('https://codeberg.org')
        .get('/api/v1/repos/forgejo-contrib/forgejo-helm/releases?draft=false')
        .reply(200, body);
      const res = await getPkgReleases({
        datasource,
        registryUrls: ['https://codeberg.org'],
        packageName: 'forgejo-contrib/forgejo-helm',
      });
      expect(res).toEqual({
        registryUrl: 'https://codeberg.org',
        releases: [
          {
            gitRef: 'v0.10.0',
            isStable: true,
            releaseTimestamp: '2023-07-27T06:19:02.000Z',
            version: 'v0.10.0',
          },
          {
            gitRef: 'v0.10.1',
            isStable: true,
            releaseTimestamp: '2023-08-02T20:31:19.000Z',
            version: 'v0.10.1',
          },
          {
            gitRef: '0.11.0',
            isStable: true,
            releaseTimestamp: '2023-08-25T08:27:19.000Z',
            version: '0.11.0',
          },
        ],
        sourceUrl: 'https://codeberg.org/forgejo-contrib/forgejo-helm',
      });
    });
  });

  describe('getDigest', () => {
    it('returns commits from codeberg.org', async () => {
      const body = [
        {
          url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/git/commits/7eb7edcfd00ffab9dddbae9e9b2deace305c9a84',
          sha: '7eb7edcfd00ffab9dddbae9e9b2deace305c9a84',
          created: '2023-08-25T08:26:28Z',
          html_url:
            'https://codeberg.org/forgejo-contrib/forgejo-helm/commit/7eb7edcfd00ffab9dddbae9e9b2deace305c9a84',
          commit: {
            url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/git/commits/7eb7edcfd00ffab9dddbae9e9b2deace305c9a84',
            message:
              'fix(deps): update helm release postgresql to v12.9.0 (#174)\n\nReviewed-on: https://codeberg.org/forgejo-contrib/forgejo-helm/pulls/174\nCo-authored-by: Michael Kriese <viceice@noreply.codeberg.org>\nCo-committed-by: Michael Kriese <viceice@noreply.codeberg.org>\n',
            tree: {
              url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/git/trees/7eb7edcfd00ffab9dddbae9e9b2deace305c9a84',
              sha: '7eb7edcfd00ffab9dddbae9e9b2deace305c9a84',
              created: '2023-08-25T08:26:28Z',
            },
            verification: null,
          },
          parents: [
            {
              url: 'https://codeberg.org/api/v1/repos/forgejo-contrib/forgejo-helm/git/commits/f19d22c6643b4643c4b2e96482b07527c84d2106',
              sha: 'f19d22c6643b4643c4b2e96482b07527c84d2106',
              created: '0001-01-01T00:00:00Z',
            },
          ],
          files: null,
          stats: null,
        },
      ];
      httpMock
        .scope('https://codeberg.org')
        .get(
          '/api/v1/repos/forgejo-contrib/forgejo-helm/commits?stat=false&verification=false&files=false&page=1&limit=1',
        )
        .reply(200, body);

      const res = await getDigest({
        datasource,
        registryUrls: ['https://codeberg.org'],
        packageName: 'forgejo-contrib/forgejo-helm',
      });
      expect(res).toBe('7eb7edcfd00ffab9dddbae9e9b2deace305c9a84');
    });
  });

  describe('getDigest with no commits', () => {
    it('returns commits from forgejo.com', async () => {
      httpMock
        .scope('https://code.forgejo.org')
        .get(
          '/api/v1/repos/some/dep2/commits?stat=false&verification=false&files=false&page=1&limit=1',
        )
        .reply(200, []);
      const res = await getDigest({
        datasource,
        packageName: 'some/dep2',
      });
      expect(res).toBeNull();
    });
  });

  describe('getTagCommit', () => {
    it('returns tags commit hash from forgejo.com', async () => {
      const body = {
        name: 'v9.0.1',
        message: 'v9.0.1',
        id: 'fb4d493a588380ac7a4037d81664363415f31650',
        commit: {
          url: 'https://code.forgejo.org/forgejo-helm/forgejo-helm/git/commits/fb4d493a588380ac7a4037d81664363415f31650',
          sha: '29c9bbb4bfec04ab22761cc2d999eb0fcb8acbed',
          created: '2023-07-19T08:42:55+02:00',
        },
        zipball_url:
          'https://code.forgejo.org/forgejo/helm-chart/archive/v9.0.1.zip',
        tarball_url:
          'https://code.forgejo.org/forgejo/helm-chart/archive/v9.0.1.tar.gz',
      };
      httpMock
        .scope('https://code.forgejo.org')
        .get('/api/v1/repos/forgejo/helm-chart/tags/v9.0.1')
        .reply(200, body);
      const res = await getDigest(
        {
          datasource,
          packageName: 'forgejo/helm-chart',
        },
        'v9.0.1',
      );
      expect(res).toBe('29c9bbb4bfec04ab22761cc2d999eb0fcb8acbed');
    });
  });
});
