noomorph/github-user-rank-extension

View on GitHub
src/background/utils/gitlance.test.ts

Summary

Maintainability
A
0 mins
Test Coverage
import test, {AssertContext, Macro} from 'ava';
import { transformIntoBadges } from './gitlance';
import {GitlanceBadgeData, GitlanceLanguageProfile, GitlanceUserProfile} from '../../common/gitlance.schema';

const macroForTransformIntoBadges: Macro<AssertContext> = (t, input: GitlanceUserProfile[], expected: GitlanceBadgeData[]) => {
    t.deepEqual(transformIntoBadges(input), expected);
};

macroForTransformIntoBadges.title = (provided: string, input: GitlanceUserProfile[], expected: GitlanceBadgeData[]) => {
    const to = expected.map(badge => badge.language[0] + badge.bits).join(',');
    const fromInner = (profile: GitlanceUserProfile) => profile.languages.map(l => l.language.name[0] + l.gitBits).join(',');
    const from = input.map(profile => `[${fromInner(profile)}]`).join(', ');

    return `${provided}: [${from}] -> [${to}]`;
};

const testCase = (title: string, input: GitlanceUserProfile[], expected: GitlanceBadgeData[]) =>
    test(title, macroForTransformIntoBadges, input, expected);

const l1_weaker: GitlanceLanguageProfile = {
    language: { name: 'JavaScript'},
    langRank: 1000,
    gitBits: 5
};

const l1_stronger: GitlanceLanguageProfile = {
    language: { name: 'JavaScript'},
    langRank: 500,
    gitBits: 5
};

const l2_weakest: GitlanceLanguageProfile = {
    language: { name: 'Ruby'},
    langRank: 10000,
    gitBits: 1
};

const l2_strongest: GitlanceLanguageProfile = {
    language: { name: 'Ruby'},
    langRank: 10,
    gitBits: 8
};

const badge = (p: GitlanceLanguageProfile): GitlanceBadgeData => ({
    language: p.language.name,
    rank: p.langRank,
    bits: p.gitBits
});

testCase('no profiles', [], []);
testCase('empty profile', [{ languages: [] }], []);
testCase('two empty profiles', [{ languages: [] }, { languages: [] }], []);
testCase('one language in a profile', [{ languages: [l1_stronger] }], [badge(l1_stronger)]);
testCase('two languages in a profile', [{ languages: [l1_stronger, l2_weakest] }], [badge(l1_stronger), badge(l2_weakest)]);
testCase('two profiles with single language', [{ languages: [l1_stronger] }, { languages: [l2_weakest] }], [badge(l1_stronger), badge(l2_weakest)]);

testCase('merge two profiles with same languages', [
    { languages: [l1_stronger, l2_weakest] },
    { languages: [l1_weaker, l2_strongest] }
], [
    badge(l2_strongest),
    badge(l1_stronger)
]);

testCase('pick, sort and uniq best languages', [
    { languages: [l2_weakest, l1_stronger, l1_weaker, l2_weakest, l1_stronger, l2_strongest] },
], [
    badge(l2_strongest),
    badge(l1_stronger)
]);