You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+192-1Lines changed: 192 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,7 +22,7 @@ Acá comenzamos a ver cómo funciona el mecanismo de routing de Svelte, que est
22
22
23
23
```
24
24
+ src
25
-
- routes
25
+
+ routes
26
26
- +page.svelte <== acá está el menú principal
27
27
+ csr
28
28
- +page.svelte <== está la página apuntada por la url `/csr`
@@ -80,3 +80,194 @@ Más adelante vamos a ver ejemplos donde quizás necesitemos disparar una búsqu
80
80
81
81
## Server-side rendering (SSR)
82
82
83
+
En la carpeta SSR podrás ver que tenemos esta estructura de archivos:
84
+
85
+
```
86
+
+ src
87
+
+ routes
88
+
+ ssr
89
+
- +page.svelte
90
+
- +page.server.ts
91
+
...
92
+
```
93
+
94
+
### Página svelte
95
+
96
+
La página Svelte contiene código que vamos a ejecutar en el cliente (el navegador), pero en este caso necesitamos que el procesamiento de la palabra (para obtener la cantidad de letras) lo haga el servidor. La interacción cliente-servidor en web siempre debe comenzar en el servidor, entonces lo más simple en este caso es agregar un botón de Submit que envía la petición al server:
- el input tiene un `name="palabra"`, en el Submit lo que hacemos es armar pares clave-valor en base a estos names
112
+
- el form indica el tipo de método http que vamos a usar, en este caso POST
113
+
-`use:enhance` propio de Svelte intercepta el formulario y hace internamente una llamada al server mediante `fetch`, una función nativa del entorno de los navegadores. Como consecuencia de ese cambio, no vamos a notar la llamada al servidor (lo que produce un típico parpadeo cuando se recarga toda la página)
114
+
115
+
### Recibiendo la información
116
+
117
+
Por convención, el archivo `+page.server.ts` se procesa en el servidor:
118
+
119
+
- recibimos la información de nuestro formulario HTML, básicamente claves/valor donde el valor será siempre un string al viajar por http
120
+
- devolvemos un JSON: la información tiene que ser serializable para poder viajar nuevamente del servidor al cliente por http
Lo que hace no es gran cosa pero sirve como ejemplo: obtiene la palabra del formulario y devuelve un JSON con la misma palabra y la longitud correspondiente.
134
+
135
+

136
+
137
+
Esa respuesta es recibida por la página Svelte, en el cliente (navegador) para descomponer la información y mostrar un div con el resultado:
Cada vez que presionamos el botón estamos yendo al servidor a procesar la palabra:
153
+
154
+

155
+
156
+
## Esquema mixto
157
+
158
+
Si renombramos nuestro archivo `+page.server.ts` a `+page.ts`, Svelte automáticamente va a trabajar en modo mixto
159
+
160
+
- la primera vez irá al server a procesar la palabra
161
+
- también descargará localmente el código (se transpilará de ts a js)
162
+
- las sucesivas veces que presionemos el botón Submit se procesará en el cliente
163
+
164
+
165
+
166
+
## Testing
167
+
168
+
### CSR
169
+
170
+
El testeo de front es similar a ejemplos anteriores, solo es interesante contar la manera en que probamos que el botón Volver nos lleva al punto raíz de la navegación:
171
+
172
+
```ts
173
+
it('should navigate to the home page when link is clicked', async () => {
- y chequeamos que al hacer click sobre el elemento eso cambia variable global `window`
183
+
184
+
### SSR
185
+
186
+
Como la estrategia SSR es un poco más compleja necesitamos agregar más tests para cubrir todos los casos. Por ejemplo queremos testear que cuando el server nos devuelve una palabra y su longitud, lo sabemos mostrar en el div:
187
+
188
+
```ts
189
+
it('should show the word length when a word is passed as props', async () => {
expect(screen.getByTestId('resultado').textContent).to.equal('La palabra "hola" tiene 4 letras.')
201
+
})
202
+
```
203
+
204
+
Pero también tenemos que chequear la información que pasamos al server cuando escribimos una palabra. Esto hace perder bastante la inocencia de los tests (algo que muchas personas podrían marcar como polémica):
205
+
206
+
```ts
207
+
it('sends the word by doing a submit', async () => {
Por qué el test pierde su naturaleza naif de caja negra? Porque sabemos que internamente no se dispara un submit hacia el server sino un fetch, mockeamos en consecuencia esta función y esperamos que dentro del segundo parámetro en la primera llamada haya una clave 'palabra'.
239
+
240
+
Por último, también debemos testear por separado el comportamiento del server:
241
+
242
+
```ts
243
+
it('should process a word and return its length', async () => {
0 commit comments