Skip to content

Commit d650b26

Browse files
committed
tests for logs
1 parent 98488f2 commit d650b26

3 files changed

Lines changed: 107 additions & 33 deletions

File tree

pkg/dashboard/frontend/cypress/e2e/a11y.cy.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ describe('a11y test suite', () => {
77
'/storage',
88
'/secrets',
99
'/topics',
10+
'/jobs',
1011
'/websockets',
12+
'/logs',
1113
'/not-found',
1214
]
1315

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
describe('logs test suite', () => {
2+
beforeEach(() => {
3+
cy.viewport('macbook-16')
4+
cy.visit('/logs')
5+
})
6+
7+
it(`Should create logs for started service`, () => {
8+
const expectedServices = [
9+
'test-app_services-my-test-secret',
10+
'test-app_services-my-test-service',
11+
'test-app_services-my-test-db',
12+
]
13+
14+
cy.getTestEl('test-row0-service').should(($el) => {
15+
expect($el.text()).to.be.oneOf(expectedServices)
16+
})
17+
cy.getTestEl('test-row1-service').should(($el) => {
18+
expect($el.text()).to.be.oneOf(expectedServices)
19+
})
20+
cy.getTestEl('test-row2-service').should(($el) => {
21+
expect($el.text()).to.be.oneOf(expectedServices)
22+
})
23+
})
24+
25+
it(`Should create logs for nodemon`, () => {
26+
const expectedLogs = [
27+
'nodemon -r dotenv/config services/my-test-secret.ts',
28+
'nodemon -r dotenv/config services/my-test-service.ts',
29+
'nodemon -r dotenv/config services/my-test-db.ts',
30+
]
31+
32+
cy.getTestEl('test-row6-msg').should(($el) => {
33+
expect($el.text()).to.be.oneOf(expectedLogs)
34+
})
35+
cy.getTestEl('test-row7-msg').should(($el) => {
36+
expect($el.text()).to.be.oneOf(expectedLogs)
37+
})
38+
cy.getTestEl('test-row8-msg').should(($el) => {
39+
expect($el.text()).to.be.oneOf(expectedLogs)
40+
})
41+
})
42+
43+
it(`Should purge logs`, () => {
44+
cy.getTestEl('logs').children().should('have.length.above', 2)
45+
46+
cy.intercept('DELETE', '/api/logs').as('purge')
47+
48+
cy.getTestEl('purge-logs-btn').click()
49+
50+
cy.wait('@purge')
51+
52+
cy.getTestEl('logs')
53+
.children()
54+
.first()
55+
.should('have.text', 'No logs available')
56+
})
57+
})

pkg/dashboard/frontend/src/components/logs/LogsExplorer.tsx

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const Logs: React.FC = () => {
1515
<div className="relative flex flex-col">
1616
<div className="flex">
1717
<Button
18+
data-testid="purge-logs-btn"
1819
onClick={purgeLogs}
1920
variant="destructive"
2021
className="ml-auto"
@@ -29,39 +30,53 @@ const Logs: React.FC = () => {
2930
<span>Service</span>
3031
<span>Message</span>
3132
</div>
32-
<div className="mt-1 flex flex-col font-mono text-sm">
33-
{logs.map(({ msg, time, serviceName }, i) => {
34-
const formattedLine = msg.trim()
35-
return (
36-
<div
37-
key={i}
38-
className={cn(
39-
'mt-0.5 grid cursor-pointer grid-cols-[200px_150px_1fr] items-start gap-x-2 whitespace-pre-wrap rounded-sm px-1 py-[2px] hover:bg-gray-100 dark:hover:bg-gray-700',
40-
{
41-
'bg-red-100 hover:bg-red-200 dark:bg-red-800/70 dark:hover:bg-red-800/90':
42-
msg.toLowerCase().includes('error'),
43-
'bg-orange-100 hover:bg-orange-200 dark:bg-orange-500/60 dark:hover:bg-orange-500/70':
44-
msg.toLowerCase().includes('warning'),
45-
},
46-
)}
47-
>
48-
<span className="w-[200px] truncate">
49-
{format(new Date(time), 'MMM dd, HH:mm:ss.SS')}
50-
</span>
51-
<Tooltip>
52-
<TooltipTrigger className="w-[150px] truncate">
53-
<span>{serviceName}</span>
54-
</TooltipTrigger>
55-
<TooltipContent>
56-
<p>{serviceName}</p>
57-
</TooltipContent>
58-
</Tooltip>
59-
<span className="border-l pl-2">
60-
{ansiToReact(formattedLine)}
61-
</span>
62-
</div>
63-
)
64-
})}
33+
<div
34+
className="mt-1 flex flex-col font-mono text-sm"
35+
data-testid="logs"
36+
>
37+
{logs.length > 0 ? (
38+
logs.map(({ msg, time, serviceName }, i) => {
39+
const formattedLine = msg.trim()
40+
return (
41+
<div
42+
key={i}
43+
className={cn(
44+
'mt-0.5 grid cursor-pointer grid-cols-[200px_150px_1fr] items-start gap-x-2 whitespace-pre-wrap rounded-sm px-1 py-[2px] hover:bg-gray-100 dark:hover:bg-gray-700',
45+
{
46+
'bg-red-100 hover:bg-red-200 dark:bg-red-800/70 dark:hover:bg-red-800/90':
47+
msg.toLowerCase().includes('error'),
48+
'bg-orange-100 hover:bg-orange-200 dark:bg-orange-500/60 dark:hover:bg-orange-500/70':
49+
msg.toLowerCase().includes('warning'),
50+
},
51+
)}
52+
>
53+
<span className="w-[200px] truncate">
54+
{format(new Date(time), 'MMM dd, HH:mm:ss.SS')}
55+
</span>
56+
<Tooltip>
57+
<TooltipTrigger className="w-[150px] truncate">
58+
<span data-testid={`test-row${i}-service`}>
59+
{serviceName}
60+
</span>
61+
</TooltipTrigger>
62+
<TooltipContent>
63+
<p>{serviceName}</p>
64+
</TooltipContent>
65+
</Tooltip>
66+
<span
67+
className="border-l pl-2"
68+
data-testid={`test-row${i}-msg`}
69+
>
70+
{ansiToReact(formattedLine)}
71+
</span>
72+
</div>
73+
)
74+
})
75+
) : (
76+
<div className="mt-4 p-1 text-center font-body text-lg font-semibold tracking-wide text-gray-500 dark:text-gray-400">
77+
No logs available
78+
</div>
79+
)}
6580
</div>
6681
</div>
6782
</AppLayout>

0 commit comments

Comments
 (0)