feat: fix dev server

Signed-off-by: Anton Ganhammar <ganhammar@gmail.com>
This commit is contained in:
Anton Ganhammar
2023-09-20 22:25:21 +02:00
parent 8cc2b97796
commit 50ea05fb73
6 changed files with 422 additions and 1 deletions
@@ -0,0 +1,174 @@
{
"metadata": {
"vcs": {
"type": "github",
"location": "https://github.com/backstage/backstage/tree/main/"
},
"generationTime": 1694413579498
},
"entity": {
"name": "backstage",
"namespace": "default",
"kind": "Component"
},
"files": [
{
"filename": "src/index.js",
"lineHits": {
"1": 1,
"2": 1,
"3": 1,
"4": 13,
"5": 13,
"6": 3,
"7": 13,
"8": 3,
"9": 13,
"10": 3,
"11": 13,
"12": 3,
"13": 13,
"14": 1,
"15": 13,
"16": 13
},
"branchHits": {
"3": {
"covered": 1,
"available": 1,
"missed": 0
},
"5": {
"covered": 1,
"available": 1,
"missed": 0
},
"7": {
"covered": 1,
"available": 1,
"missed": 0
},
"9": {
"covered": 1,
"available": 1,
"missed": 0
},
"11": {
"covered": 1,
"available": 1,
"missed": 0
},
"13": {
"covered": 1,
"available": 1,
"missed": 0
}
}
},
{
"filename": "src/math.js",
"lineHits": {
"1": 1,
"2": 3,
"3": 2,
"4": 2,
"5": 1,
"6": 1,
"7": 1,
"8": 1,
"9": 3,
"10": 2,
"11": 2,
"12": 1,
"13": 1,
"14": 1,
"15": 1,
"16": 3,
"17": 2,
"18": 2,
"19": 1,
"20": 1,
"21": 1,
"22": 1,
"23": 3,
"24": 2,
"25": 3,
"26": 0,
"27": 0,
"28": 1,
"29": 1
},
"branchHits": {
"2": {
"covered": 3,
"available": 3,
"missed": 0
},
"5": {
"covered": 1,
"available": 1,
"missed": 0
},
"8": {
"covered": 1,
"available": 1,
"missed": 0
},
"9": {
"covered": 2,
"available": 2,
"missed": 0
},
"12": {
"covered": 1,
"available": 1,
"missed": 0
},
"15": {
"covered": 1,
"available": 1,
"missed": 0
},
"16": {
"covered": 2,
"available": 2,
"missed": 0
},
"19": {
"covered": 1,
"available": 1,
"missed": 0
},
"22": {
"covered": 1,
"available": 1,
"missed": 0
},
"23": {
"covered": 2,
"available": 2,
"missed": 0
},
"25": {
"covered": 1,
"available": 2,
"missed": 1
}
}
}
],
"aggregate": {
"line": {
"available": 45,
"covered": 43,
"missed": 2,
"percentage": 95.56
},
"branch": {
"available": 23,
"covered": 22,
"missed": 1,
"percentage": 95.65
}
}
}
@@ -0,0 +1,84 @@
{
"entity": {
"name": "backstage",
"kind": "component",
"namespace": "default"
},
"history": [
{
"timestamp": 1694413579498,
"branch": {
"available": 23,
"covered": 22,
"missed": 1,
"percentage": 95.65
},
"line": {
"available": 45,
"covered": 43,
"missed": 2,
"percentage": 95.56
}
},
{
"timestamp": 1694178927072,
"branch": {
"available": 23,
"covered": 22,
"missed": 1,
"percentage": 95.65
},
"line": {
"available": 45,
"covered": 43,
"missed": 2,
"percentage": 95.56
}
},
{
"timestamp": 1694178830777,
"branch": {
"available": 19,
"covered": 18,
"missed": 1,
"percentage": 94.74
},
"line": {
"available": 45,
"covered": 43,
"missed": 2,
"percentage": 95.56
}
},
{
"timestamp": 1694178708402,
"branch": {
"available": 15,
"covered": 10,
"missed": 5,
"percentage": 66.67
},
"line": {
"available": 45,
"covered": 36,
"missed": 9,
"percentage": 80
}
},
{
"timestamp": 1694178270486,
"branch": {
"available": 10,
"covered": 5,
"missed": 5,
"percentage": 50
},
"line": {
"available": 45,
"covered": 26,
"missed": 19,
"percentage": 57.78
}
}
]
}
@@ -0,0 +1,16 @@
import { add, multiply, subtract, divide } from "./math";
export default (a, b, operator) => {
switch(operator) {
case '+':
return add(a, b);
case '-':
return subtract(a, b);
case '*':
return multiply(a, b);
case '/':
return divide(a, b);
default:
throw new Error('Invalid operator');
}
};
@@ -0,0 +1,29 @@
export function add(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
}
return a + b;
}
export function subtract(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
}
return a - b;
}
export function multiply(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
}
return a * b;
}
export function divide(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
} else if (b === 0) {
throw new Error('Division by zero');
}
return a / b;
}
@@ -0,0 +1,64 @@
/*
* Copyright 2023 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export default {
'src/index.js': `import { add, multiply, subtract, divide } from \"./math\";
export default (a, b, operator) => {
switch(operator) {
case '+':
return add(a, b);
case '-':
return subtract(a, b);
case '*':
return multiply(a, b);
case '/':
return divide(a, b);
default:
throw new Error('Invalid operator');
}
};
`,
'src/math.js': `export function add(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
}
return a + b;
}
export function subtract(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
}
return a - b;
}
export function multiply(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
}
return a * b;
}
export function divide(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('Invalid input');
} else if (b === 0) {
throw new Error('Division by zero');
}
return a / b;
}
`,
};
+55 -1
View File
@@ -16,11 +16,65 @@
import React from 'react';
import { createDevApp } from '@backstage/dev-utils';
import { codeCoveragePlugin, EntityCodeCoverageContent } from '../src/plugin';
import { CompoundEntityRef, Entity } from '@backstage/catalog-model';
import { EntityProvider } from '@backstage/plugin-catalog-react';
import { codeCoverageApiRef, CodeCoverageApi } from '../src/api';
import coverageForEntity from './__fixtures__/coverage-for-entity.json';
import coverageHistoryForEntity from './__fixtures__/coverage-history-for-entity.json';
import fileContentFromEntity from './__fixtures__/get-file-content-from-entity';
const mockEntity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
name: 'backstage',
description: 'backstage.io',
annotations: {
'backstage.io/code-coverage': 'enabled',
},
},
spec: {
lifecycle: 'production',
type: 'website',
owner: 'user:guest',
},
};
const mockCodeCoverageApi: CodeCoverageApi = {
async getCoverageForEntity(_entity: CompoundEntityRef) {
return coverageForEntity as any;
},
async getFileContentFromEntity(_entity: CompoundEntityRef, filePath: string) {
switch (filePath) {
case 'src/index.js':
return fileContentFromEntity['src/index.js'];
case 'src/math.js':
return fileContentFromEntity['src/math.js'];
default:
return '';
}
},
async getCoverageHistoryForEntity(
_entity: CompoundEntityRef,
_limit?: number,
) {
return coverageHistoryForEntity;
},
};
createDevApp()
.registerApi({
api: codeCoverageApiRef,
deps: {},
factory: () => mockCodeCoverageApi,
})
.registerPlugin(codeCoveragePlugin)
.addPage({
element: <EntityCodeCoverageContent />,
element: (
<EntityProvider entity={mockEntity}>
<EntityCodeCoverageContent />
</EntityProvider>
),
title: 'Root Page',
})
.render();