1/**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 */
9
10const {
11  parseVersion,
12  isTaggedLatest,
13  isReleaseBranch,
14} = require('../version-utils');
15
16let execResult = null;
17jest.mock('shelljs', () => ({
18  exec: () => {
19    return {
20      stdout: execResult,
21    };
22  },
23}));
24
25describe('version-utils', () => {
26  describe('isReleaseBranch', () => {
27    it('should identify as release branch', () => {
28      expect(isReleaseBranch('v0.66-stable')).toBe(true);
29      expect(isReleaseBranch('0.66-stable')).toBe(true);
30      expect(isReleaseBranch('made-up-stuff-stable')).toBe(true);
31    });
32    it('should not identify as release branch', () => {
33      expect(isReleaseBranch('main')).toBe(false);
34      expect(isReleaseBranch('pull/32659')).toBe(false);
35    });
36  });
37  describe('isTaggedLatest', () => {
38    it('it should identify commit as tagged `latest`', () => {
39      execResult = '6c19dc3266b84f47a076b647a1c93b3c3b69d2c5\n';
40      expect(isTaggedLatest('6c19dc3266b84f47a076b647a1c93b3c3b69d2c5')).toBe(
41        true,
42      );
43    });
44    it('it should not identify commit as tagged `latest`', () => {
45      execResult = '6c19dc3266b84f47a076b647a1c93b3c3b69d2c5\n';
46      expect(isTaggedLatest('6c19dc3266b8')).toBe(false);
47    });
48  });
49
50  describe('parseVersion', () => {
51    it('should throw error if invalid match', () => {
52      function testInvalidVersion() {
53        parseVersion('<invalid version>');
54      }
55      expect(testInvalidVersion).toThrowErrorMatchingInlineSnapshot(
56        `"You must pass a correctly formatted version; couldn't parse <invalid version>"`,
57      );
58    });
59
60    it('should parse pre-release version with .', () => {
61      const {version, major, minor, patch, prerelease} =
62        parseVersion('0.66.0-rc.4');
63      expect(version).toBe('0.66.0-rc.4');
64      expect(major).toBe('0');
65      expect(minor).toBe('66');
66      expect(patch).toBe('0');
67      expect(prerelease).toBe('rc.4');
68    });
69
70    it('should parse pre-release version with -', () => {
71      const {version, major, minor, patch, prerelease} =
72        parseVersion('0.66.0-rc-4');
73      expect(version).toBe('0.66.0-rc-4');
74      expect(major).toBe('0');
75      expect(minor).toBe('66');
76      expect(patch).toBe('0');
77      expect(prerelease).toBe('rc-4');
78    });
79
80    it('should parse stable version', () => {
81      const {version, major, minor, patch, prerelease} = parseVersion('0.66.0');
82      expect(version).toBe('0.66.0');
83      expect(major).toBe('0');
84      expect(minor).toBe('66');
85      expect(patch).toBe('0');
86      expect(prerelease).toBeUndefined();
87    });
88    it('should parse pre-release version from tag', () => {
89      const {version, major, minor, patch, prerelease} =
90        parseVersion('v0.66.1-rc.4');
91      expect(version).toBe('0.66.1-rc.4');
92      expect(major).toBe('0');
93      expect(minor).toBe('66');
94      expect(patch).toBe('1');
95      expect(prerelease).toBe('rc.4');
96    });
97
98    it('should parse stable version from tag', () => {
99      const {version, major, minor, patch, prerelease} =
100        parseVersion('v0.66.0');
101      expect(version).toBe('0.66.0');
102      expect(major).toBe('0');
103      expect(minor).toBe('66');
104      expect(patch).toBe('0');
105      expect(prerelease).toBeUndefined();
106    });
107
108    it('should parse nightly fake version', () => {
109      const {version, major, minor, patch, prerelease} = parseVersion('0.0.0');
110      expect(version).toBe('0.0.0');
111      expect(major).toBe('0');
112      expect(minor).toBe('0');
113      expect(patch).toBe('0');
114      expect(prerelease).toBeUndefined();
115    });
116
117    it('should parse dryrun fake version', () => {
118      const {version, major, minor, patch, prerelease} =
119        parseVersion('1000.0.0');
120      expect(version).toBe('1000.0.0');
121      expect(major).toBe('1000');
122      expect(minor).toBe('0');
123      expect(patch).toBe('0');
124      expect(prerelease).toBeUndefined();
125    });
126  });
127});
128