npm semver - test code 작성하기 (intersects, satisfies)

slaslaya·2020년 4월 3일
1

업데이트 계산하는 게 머리 아플 수 있다.
이러한 계산을 semver 라이브러리로 매우! 손쉽게! 할 수 있다!
https://www.npmjs.com/package/semver

문서내에 Usage를 확인하면

const semver = require('semver')
 
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
semver.clean('  =v1.2.3   ') // '1.2.3'
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
semver.gt('1.2.3', '9.8.7') // false
semver.lt('1.2.3', '9.8.7') // true
semver.minVersion('>=1.0.0') // '1.0.0'
semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'

대략적으로 감이온다..

semver functions test 작성하기


$ npx create-zeroconfig-app semver-test

select repository는 react-zeroconfig/typescript-playground : Typescript Playground (jest, storybook) 으로 한다.
사실 typeScript를 적용하지 못해서 굳이 똑같이 따라할 필요는 없다.

$ npm install --save-dev semver

test start

$ npm test
const semver = require('semver');
    
    describe('npm-semver functions test', () => {
      test('valid(release)는 parsing version을 반환해야하며, 유효하지 않다면 null을 반환해야 한다.', () => {
        expect(semver.valid('1.2.3')).toEqual('1.2.3');
        expect(semver.valid(semver.coerce('^1.2.3'))).toEqual('1.2.3');
        expect(semver.valid('a.b.c')).toEqual(null);
      });
    
      test('inc(v, release)는 release type (major, premajor, minor, preminor, patch, prepatch, or prerelease)이 증가된 버전을 반환해야하며, 유효하지 않다면 null을 반환해야 한다.', () => {
        expect(semver.inc('1.2.3-alpha.2', 'major')).toEqual('2.0.0');
        expect(semver.inc('1.2.3-alpha.2', 'premajor')).toEqual('2.0.0-0');
        expect(semver.inc('1.2.3', 'minor')).toEqual('1.3.0');
        expect(semver.inc('3.27.2-alpha.2', 'prepatch')).toEqual('3.27.3-0');
        expect(semver.inc('3.27.2-alpha.2', 'prerelease')).toEqual('3.27.2-alpha.3');
      });
    
      test('intersects(r1, r2, loose)는 범위에 허용되는 경우 true를 반환해야 한다.', () => {
        expect(semver.intersects('^1.2.3', '2.0.0')).toEqual(false);
        expect(semver.intersects('^1.0.0', '1.9.0')).toEqual(true);
        expect(semver.intersects('^1.2.3-beta.2', '^1.2.3-beta.4')).toEqual(true);
        expect(semver.intersects('~1.2.3', '~1.3.0')).toEqual(false);
        expect(semver.intersects('~1', '2')).toEqual(false);
      });
    
      test('prerelease(v)는 prerelease의 구성요소를 배열로 반환해야하며 없는 경우 null을 반환해야 한다.', () => {
        expect(semver.prerelease('1.2.3-alpha.2')).toEqual(['alpha', 2]);
        expect(semver.prerelease('1.2.3')).toEqual(null);
      });
    
      test('parse(v)는 SemVer object또는 null을 반환해야 한다.', () => {
        const semVerObj = {
          build: [],
          includePrerelease: false,
          loose: false,
          major: 1,
          minor: 2,
          options: { includePrerelease: false, loose: false },
          patch: 3,
          prerelease: ['alpha', 2],
          raw: '1.2.3-alpha.2',
          version: '1.2.3-alpha.2',
        };
    
        expect(semver.parse('1.2.3-alpha.2')).toEqual(semVerObj);
      });
    
      test('satisfies(version, range)는 버전이 range에 해당된다면 true를 반환해야 한다.', () => {
        expect(semver.satisfies('1.2.3', '^1.2.2')).toEqual(true);
        expect(semver.satisfies('2.0.0', '^1.2.2')).toEqual(false);
        expect(semver.satisfies('1.2.3', '>=1.0.0 <2.0.0')).toEqual(true);
        expect(semver.satisfies('~1.2.3', '~1.3.0')).toEqual(false);
      });
    });

다양한 function들이 있고
https://github.com/npm/node-semver#functions
이 내용을 참고 하였다.

전부다 작성하진 않았고
비교하기에 적절한 function과 기본이 될 수 있는 function들로 test를 작성하였다.

  • valid(release): parsing version을 반환해야하며, 유효하지 않다면 null을 반환
  • inc(v, release): release type (major, premajor, minor, preminor, patch, prepatch, or prerelease)이 증가된 버전을 반환해야하며, 유효하지 않다면 null을 반환
  • intersects(r1, r2, loose): 범위에 허용되는 경우 true를 반환
  • parse(v): SemVer object또는 null을 반환
    const semVerObj = {
      build: [],
      includePrerelease: false,
      loose: false,
      major: 1,
      minor: 2,
      options: { includePrerelease: false, loose: false },
      patch: 3,
      prerelease: ['alpha', 2],
      raw: '1.2.3-alpha.2',
      version: '1.2.3-alpha.2',
    };
  • satisfies(version, range): 버전이 range에 해당된다면 true를 반환

범위에 허용되는지를 확인한다면 intersects(r1, r2, loose)satisfies(version, range)를 추천한다.


github

https://github.com/yami03/semver-test/blob/master/src/__tests__/semver.ts

profile
안녕하새요

0개의 댓글