Skip to content

Commit df9536e

Browse files
authored
Merge pull request nullstack#395 from aylonmuramatsu/svg-support
feat: implementa testes e adiciona correção para render do server
2 parents 73df30c + 0b51beb commit df9536e

File tree

3 files changed

+95
-7
lines changed

3 files changed

+95
-7
lines changed

server/render.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isFalse } from '../shared/nodes'
1+
import { isFalse, isText } from '../shared/nodes'
22
import { sanitizeHtml } from '../shared/sanitizeString'
33
import renderAttributes from './renderAttributes'
44

@@ -25,7 +25,7 @@ function renderBody(node, scope, next) {
2525
if (isFalse(node)) {
2626
return '<!---->'
2727
}
28-
if (node.type === 'text') {
28+
if (isText(node)) {
2929
const text = node.text === '' ? ' ' : sanitizeHtml(node.text.toString())
3030
return next && next.type === 'text' ? `${text}<!--#-->` : text
3131
}

tests/src/SvgSupport.njs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class SvgSupport extends Nullstack {
2626

2727
render() {
2828
return (
29-
<div>
29+
<div data-hydrated={this.hydrated}>
3030
<svg viewBox="0 0 240 80" xmlns="http://www.w3.org/2000/svg">
3131
<text x="20" y="35" class="small">I</text>
3232
<text x="40" y="35" class="heavy">love</text>

tests/src/SvgSupport.test.js

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,106 @@ describe('SvgSupport', () => {
55
})
66

77
test('svg can render text', async () => {
8-
expect(true).toBeTruthy()
8+
// Verifica se o SVG possui 4 elementos <text> dentro dele
9+
const svg = await page.$('svg');
10+
const texts = await svg.$$('text');
11+
expect(texts.length).toBe(4);
912
})
1013

1114
test('svg can add new paths while rerendering', async () => {
12-
expect(true).toBeTruthy()
15+
// Verifica se o ícone Hamburger está presente inicialmente (3 paths)
16+
const hamburgerPaths = await page.$$('svg[width="30"] path')
17+
expect(hamburgerPaths.length).toBe(3) // Hamburger has 3 paths
1318
})
1419

1520
test('svg can render in short circuit statements', async () => {
16-
expect(true).toBeTruthy()
21+
// Verifica se o ícone de Hamburger está sendo exibido (3 paths)
22+
const hamburgerPaths = await page.$$('svg[width="30"] path')
23+
expect(hamburgerPaths.length).toBe(3)
1724
})
1825

1926
test('svg can render in ternary statements', async () => {
20-
expect(true).toBeTruthy()
27+
let bigHamburger = await page.$('svg[width="69"]')
28+
expect(bigHamburger).toBeFalsy()
29+
30+
// Clica no segundo botão (show)
31+
const buttons = await page.$$('button')
32+
await buttons[1].click()
33+
34+
// Aguarda o Hamburger grande aparecer
35+
await page.waitForSelector('svg[width="69"]')
36+
37+
// Verifica se o Hamburger foi renderizado no ternário
38+
bigHamburger = await page.$('svg[width="69"]')
39+
expect(bigHamburger).toBeTruthy()
40+
41+
})
42+
43+
test('icon toggle functionality works correctly', async () => {
44+
// Primeiro verifica o estado inicial (deve ser Hamburger, 3 paths)
45+
let iconPaths = await page.$$('svg[width="30"] path')
46+
expect(iconPaths.length).toBe(3) // Hamburger tem 3 paths
47+
48+
// Clica no primeiro botão (toggle)
49+
const buttons = await page.$$('button')
50+
await buttons[0].click()
51+
52+
// Aguarda o ícone trocar (Close tem 2 paths)
53+
await page.waitForFunction(() => {
54+
const svg = document.querySelector('svg[width="30"]');
55+
return svg && svg.querySelectorAll('path').length === 2;
56+
});
57+
58+
iconPaths = await page.$$('svg[width="30"] path')
59+
expect(iconPaths.length).toBe(2) // Close tem 2 paths
60+
61+
// Clica novamente para voltar ao Hamburger
62+
await buttons[0].click()
63+
64+
// Aguarda o ícone trocar de volta (Hamburger tem 3 paths)
65+
await page.waitForFunction(() => {
66+
const svg = document.querySelector('svg[width="30"]');
67+
return svg && svg.querySelectorAll('path').length === 3;
68+
});
69+
70+
iconPaths = await page.$$('svg[width="30"] path')
71+
expect(iconPaths.length).toBe(3) // Hamburger tem 3 paths
72+
})
73+
74+
test('icon visibility toggle works correctly', async () => {
75+
76+
// Verifica que o ícone grande não está visível inicialmente
77+
let bigHamburger = await page.$('svg[width="69"]')
78+
expect(bigHamburger).toBeFalsy()
79+
80+
// Clica no segundo botão (show)
81+
const buttons = await page.$$('button')
82+
await buttons[1].click()
83+
84+
// Aguarda o Hamburger grande aparecer
85+
await page.waitForSelector('svg[width="69"]')
86+
87+
// Verifica se o Hamburger grande apareceu
88+
bigHamburger = await page.$('svg[width="69"]')
89+
expect(bigHamburger).toBeTruthy()
90+
91+
// Clica novamente no segundo botão (show) para esconder
92+
await buttons[1].click()
93+
94+
// Aguarda o Hamburger grande desaparecer do DOM
95+
await page.waitForSelector('svg[width="69"]', { hidden: true })
96+
97+
// Verifica se o Hamburger grande desapareceu
98+
bigHamburger = await page.$('svg[width="69"]')
99+
expect(bigHamburger).toBeFalsy()
100+
})
101+
102+
test('svg attributes are correctly applied', async () => {
103+
// Verifica se os atributos SVG estão sendo aplicados corretamente
104+
const svgElement = await page.$('svg[viewBox="0 0 240 80"]')
105+
expect(svgElement).toBeTruthy()
106+
107+
const xmlns = await page.$eval('svg[viewBox="0 0 240 80"]', el => el.getAttribute('xmlns'))
108+
expect(xmlns).toBe('http://www.w3.org/2000/svg')
21109
})
22110
})

0 commit comments

Comments
 (0)