text_utility_spec.js 8.6 KB
Newer Older
F
Filipa Lacerda 已提交
1
import * as textUtils from '~/lib/utils/text_utility';
C
Clement Ho 已提交
2

3
describe('text_utility', () => {
F
Filipa Lacerda 已提交
4 5 6 7
  describe('addDelimiter', () => {
    it('should add a delimiter to the given string', () => {
      expect(textUtils.addDelimiter('1234')).toEqual('1,234');
      expect(textUtils.addDelimiter('222222')).toEqual('222,222');
8
    });
C
Clement Ho 已提交
9

F
Filipa Lacerda 已提交
10 11
    it('should not add a delimiter if string contains no numbers', () => {
      expect(textUtils.addDelimiter('aaaa')).toEqual('aaaa');
12
    });
13
  });
14

15
  describe('highCountTrim', () => {
16
    it('returns 99+ for count >= 100', () => {
F
Filipa Lacerda 已提交
17 18
      expect(textUtils.highCountTrim(105)).toBe('99+');
      expect(textUtils.highCountTrim(100)).toBe('99+');
19
    });
20

21
    it('returns exact number for count < 100', () => {
F
Filipa Lacerda 已提交
22
      expect(textUtils.highCountTrim(45)).toBe(45);
C
Clement Ho 已提交
23 24 25
    });
  });

F
Filipa Lacerda 已提交
26 27 28
  describe('humanize', () => {
    it('should remove underscores and uppercase the first letter', () => {
      expect(textUtils.humanize('foo_bar')).toEqual('Foo bar');
29
    });
30 31 32
    it('should remove underscores and dashes and uppercase the first letter', () => {
      expect(textUtils.humanize('foo_bar-foo', '[_-]')).toEqual('Foo bar foo');
    });
F
Filipa Lacerda 已提交
33
  });
34

F
Filipa Lacerda 已提交
35 36 37 38 39
  describe('dasherize', () => {
    it('should replace underscores with dashes', () => {
      expect(textUtils.dasherize('foo_bar_foo')).toEqual('foo-bar-foo');
    });
  });
40

41 42 43 44 45 46
  describe('capitalizeFirstCharacter', () => {
    it('returns string with first letter capitalized', () => {
      expect(textUtils.capitalizeFirstCharacter('gitlab')).toEqual('Gitlab');
    });
  });

47 48 49 50
  describe('slugify', () => {
    it('should remove accents and convert to lower case', () => {
      expect(textUtils.slugify('João')).toEqual('jo-o');
    });
51
    it('should replaces whitespaces with hyphens and convert to lower case', () => {
52 53 54 55 56 57
      expect(textUtils.slugify('My Input String')).toEqual('my-input-string');
    });
    it('should remove trailing whitespace and replace whitespaces within string with a hyphen', () => {
      expect(textUtils.slugify(' a new project ')).toEqual('a-new-project');
    });
    it('should only remove non-allowed special characters', () => {
58
      expect(textUtils.slugify('test!_pro-ject~')).toEqual('test-_pro-ject');
59 60
    });
    it('should squash multiple hypens', () => {
61
      expect(textUtils.slugify('test!!!!_pro-ject~')).toEqual('test-_pro-ject');
62 63 64
    });
    it('should return empty string if only non-allowed characters', () => {
      expect(textUtils.slugify('здрасти')).toEqual('');
65
    });
66 67 68 69 70 71
    it('should squash multiple separators', () => {
      expect(textUtils.slugify('Test:-)')).toEqual('test');
    });
    it('should trim any separators from the beginning and end of the slug', () => {
      expect(textUtils.slugify('-Test:-)-')).toEqual('test');
    });
72 73
  });

T
Tim Zallmann 已提交
74
  describe('stripHtml', () => {
75
    it('replaces html tag with the default replacement', () => {
76 77 78
      expect(textUtils.stripHtml('This is a text with <p>html</p>.')).toEqual(
        'This is a text with html.',
      );
79 80 81
    });

    it('replaces html tags with the provided replacement', () => {
82 83 84
      expect(textUtils.stripHtml('This is a text with <p>html</p>.', ' ')).toEqual(
        'This is a text with  html .',
      );
85
    });
86 87 88 89 90 91 92 93

    it('passes through with null string input', () => {
      expect(textUtils.stripHtml(null, ' ')).toEqual(null);
    });

    it('passes through with undefined string input', () => {
      expect(textUtils.stripHtml(undefined, ' ')).toEqual(undefined);
    });
94
  });
95 96

  describe('convertToCamelCase', () => {
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
    it.each`
      txt                         | result
      ${'a_snake_cased_string'}   | ${'aSnakeCasedString'}
      ${'_leading_underscore'}    | ${'_leadingUnderscore'}
      ${'__leading_underscores'}  | ${'__leadingUnderscores'}
      ${'trailing_underscore_'}   | ${'trailingUnderscore_'}
      ${'trailing_underscores__'} | ${'trailingUnderscores__'}
    `('converts string "$txt" to "$result"', ({ txt, result }) => {
      expect(textUtils.convertToCamelCase(txt)).toBe(result);
    });

    it.each`
      txt
      ${'__withoutMiddleUnderscores__'}
      ${''}
      ${'with spaces'}
      ${'with\nnew\r\nlines'}
      ${'_'}
      ${'___'}
    `('does not modify string "$txt"', ({ txt }) => {
      expect(textUtils.convertToCamelCase(txt)).toBe(txt);
118 119
    });
  });
120

121 122 123 124 125 126 127 128 129 130 131 132 133
  describe('convertToSnakeCase', () => {
    it.each`
      txt                      | result
      ${'snakeCase'}           | ${'snake_case'}
      ${'snake Case'}          | ${'snake_case'}
      ${'snake case'}          | ${'snake_case'}
      ${'snake_case'}          | ${'snake_case'}
      ${'snakeCasesnake Case'} | ${'snake_casesnake_case'}
    `('converts string $txt to $result string', ({ txt, result }) => {
      expect(textUtils.convertToSnakeCase(txt)).toEqual(result);
    });
  });

134 135 136 137 138
  describe('convertToSentenceCase', () => {
    it('converts Sentence Case to Sentence case', () => {
      expect(textUtils.convertToSentenceCase('Hello World')).toBe('Hello world');
    });
  });
F
Felipe Artur 已提交
139

140 141 142 143 144 145
  describe('convertToTitleCase', () => {
    it('converts sentence case to Sentence Case', () => {
      expect(textUtils.convertToTitleCase('hello world')).toBe('Hello World');
    });
  });

F
Felipe Artur 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
  describe('truncateSha', () => {
    it('shortens SHAs to 8 characters', () => {
      expect(textUtils.truncateSha('verylongsha')).toBe('verylong');
    });

    it('leaves short SHAs as is', () => {
      expect(textUtils.truncateSha('shortsha')).toBe('shortsha');
    });
  });

  describe('splitCamelCase', () => {
    it('separates a PascalCase word to two', () => {
      expect(textUtils.splitCamelCase('HelloWorld')).toBe('Hello World');
    });
  });
161 162

  describe('getFirstCharacterCapitalized', () => {
G
George Tsiolis 已提交
163
    it('returns the first character capitalized, if first character is alphabetic', () => {
164 165 166 167 168 169 170 171 172 173 174 175 176 177
      expect(textUtils.getFirstCharacterCapitalized('loremIpsumDolar')).toEqual('L');
      expect(textUtils.getFirstCharacterCapitalized('Sit amit !')).toEqual('S');
    });

    it('returns the first character, if first character is non-alphabetic', () => {
      expect(textUtils.getFirstCharacterCapitalized(' lorem')).toEqual(' ');
      expect(textUtils.getFirstCharacterCapitalized('%#!')).toEqual('%');
    });

    it('returns an empty string, if string is falsey', () => {
      expect(textUtils.getFirstCharacterCapitalized('')).toEqual('');
      expect(textUtils.getFirstCharacterCapitalized(null)).toEqual('');
    });
  });
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

  describe('truncatePathMiddleToLength', () => {
    it('does not truncate text', () => {
      expect(textUtils.truncatePathMiddleToLength('app/test', 50)).toEqual('app/test');
    });

    it('truncates middle of the path', () => {
      expect(textUtils.truncatePathMiddleToLength('app/test/diff', 13)).toEqual('app/…/diff');
    });

    it('truncates multiple times in the middle of the path', () => {
      expect(textUtils.truncatePathMiddleToLength('app/test/merge_request/diff', 13)).toEqual(
        'app/…/…/diff',
      );
    });
  });
194

195 196 197 198 199 200
  describe('slugifyWithUnderscore', () => {
    it('should replaces whitespaces with underscore and convert to lower case', () => {
      expect(textUtils.slugifyWithUnderscore('My Input String')).toEqual('my_input_string');
    });
  });

201 202 203 204 205
  describe('truncateNamespace', () => {
    it(`should return the root namespace if the namespace only includes one level`, () => {
      expect(textUtils.truncateNamespace('a / b')).toBe('a');
    });

206
    it(`should return the first 2 namespaces if the namespace includes exactly 2 levels`, () => {
207 208 209
      expect(textUtils.truncateNamespace('a / b / c')).toBe('a / b');
    });

210
    it(`should return the first and last namespaces, separated by "...", if the namespace includes more than 2 levels`, () => {
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
      expect(textUtils.truncateNamespace('a / b / c / d')).toBe('a / ... / c');
      expect(textUtils.truncateNamespace('a / b / c / d / e / f / g / h / i')).toBe('a / ... / h');
    });

    it(`should return an empty string for invalid inputs`, () => {
      [undefined, null, 4, {}, true, new Date()].forEach(input => {
        expect(textUtils.truncateNamespace(input)).toBe('');
      });
    });

    it(`should not alter strings that aren't formatted as namespaces`, () => {
      ['', ' ', '\t', 'a', 'a \\ b'].forEach(input => {
        expect(textUtils.truncateNamespace(input)).toBe(input);
      });
    });
  });
227 228 229 230 231 232 233 234 235 236 237 238 239 240

  describe('hasContent', () => {
    it.each`
      txt                 | result
      ${null}             | ${false}
      ${undefined}        | ${false}
      ${{ an: 'object' }} | ${false}
      ${''}               | ${false}
      ${' \t\r\n'}        | ${false}
      ${'hello'}          | ${true}
    `('returns $result for input $txt', ({ result, txt }) => {
      expect(textUtils.hasContent(txt)).toEqual(result);
    });
  });
241
});