Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Test at Scale Badge, run [TAS] #7612

Merged
merged 15 commits into from
Mar 5, 2022
111 changes: 111 additions & 0 deletions services/tas/tas-tests.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import Joi from 'joi'
import { BaseJsonService } from '../index.js'
import {
testResultQueryParamSchema,
renderTestResultBadge,
} from '../test-results.js'
import { nonNegativeInteger } from '../../services/validators.js'

const commonAttrs = {
namedParams: {
provider: 'github',
org: 'tasdemo',
repo: 'axios',
},
queryParams: {
passed_label: 'passed',
failed_label: 'failed',
skipped_label: 'skipped',
compact_message: null,
},
}

const schema = Joi.object({
badge: Joi.object({
passed: nonNegativeInteger,
failed: nonNegativeInteger,
skipped: nonNegativeInteger,
total_tests: nonNegativeInteger,
status: Joi.string().required(),
}).required(),
}).required()

export default class TasBuildStatus extends BaseJsonService {
static category = 'test-results'

static route = {
base: 'tas/tests',
pattern: ':provider/:org/:repo',
queryParamSchema: testResultQueryParamSchema,
}

static examples = [
{
title: 'TAS Tests',
staticPreview: this.render({
passed: 20,
failed: 1,
skipped: 1,
total: 22,
}),
...commonAttrs,
},
]

static defaultBadgeData = { label: 'tests' }

static render({
passed,
failed,
skipped,
total,
passedLabel,
failedLabel,
skippedLabel,
isCompact,
}) {
return renderTestResultBadge({
passed,
failed,
skipped,
total,
passedLabel,
failedLabel,
skippedLabel,
isCompact,
})
}

async fetch({ provider, org, repo }) {
return this._requestJson({
schema,
url: `https://api.tas.lambdatest.com/repo/badge?git_provider=${provider}&org=${org}&repo=${repo}`,
errorMessages: {
401: 'private project not supported',
404: 'project not found',
},
})
}

async handle(
{ provider, org, repo },
{
compact_message: compactMessage,
passed_label: passedLabel,
failed_label: failedLabel,
skipped_label: skippedLabel,
}
) {
const { badge } = await this.fetch({ provider, org, repo })
return this.constructor.render({
passed: badge.passed,
failed: badge.failed,
skipped: badge.skipped,
total: badge.total_tests,
passedLabel,
failedLabel,
skippedLabel,
isCompact: compactMessage !== undefined,
})
}
}
52 changes: 52 additions & 0 deletions services/tas/tas-tests.tester.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { createServiceTester } from '../tester.js'
import {
isDefaultTestTotals,
isCustomTestTotals,
isCustomCompactTestTotals,
} from '../test-validators.js'

export const t = await createServiceTester()

t.create('Test status')
.get('/github/tasdemo/axios.json')
.expectBadge({ label: 'tests', message: isDefaultTestTotals })

t.create('Test status with custom labels')
.get('/github/tasdemo/axios.json', {
qs: {
passed_label: 'good',
failed_label: 'bad',
skipped_label: 'n/a',
},
})
.expectBadge({ label: 'tests', message: isCustomTestTotals })

t.create('Test status with compact message and custom labels')
.get('/github/tasdemo/axios.json', {
qs: {
compact_message: null,
passed_label: '💃',
failed_label: '🤦‍♀️',
skipped_label: '🤷',
},
})
.expectBadge({
label: 'tests',
message: isCustomCompactTestTotals,
})

t.create('Test status on project that does not exist')
.get('/github/tasdemo/doesntexist.json')
.expectBadge({
label: 'tests',
message: 'project not found',
color: 'red',
})

t.create('Test status on private project')
.get('/github/tasdemo/nexe-private.json')
.expectBadge({
label: 'tests',
message: 'private project not supported',
color: 'lightgrey',
})