Tests con RSpec para autenticación de tokens
Clase 21 de 33 • Curso de Creación de APIs con Ruby on Rails
Contenido del curso
Proyecto
- 3

Creación de APIs con Rails: Proyecto Blog API paso a paso
04:37 min - 4

Configuración de Gemas para Pruebas en Proyectos Rails
06:26 min - 5

Configuración de Gemas en Proyectos Rails: Arspec, Factory Bot y Database Cleaner
07:25 min - 6

Implementación de un Health Check Endpoint en API con RSpec
12:28 min - 7

Diseño de Casos de Uso y Diagramas de Entidad para Aplicaciones
03:16 min - 8

Diagrama entidad relación: usuario y post
01:41 min - 9

Modelado de Aplicaciones con TDD en Rails
05:59 min - 10

Validaciones y Pruebas TDD en Rails: Modelos USR y Post
07:07 min - 11

Implementación de Endpoints para Listar y Mostrar Posts con TDD
15:12 min - 12

Implementar controlador Posts con TDD
10:34 min - 13

Pruebas TDD para crear y actualizar posts
10:12 min - 14

Implementación de Métodos y Manejo de Excepciones en Rails API
10:23 min - 15

Active Model serializers: control total de JSON en Rails
06:03 min - 16

Búsqueda y Filtrado de Posts por Título con TDD
05:57 min - 17

Implementación de Búsqueda de Posts con Servicios en Rails
06:06 min - 18

Problema N+1 en Rails: Detección y Solución Eficaz
04:40 min - 19

Identificación y solución del problema N+1 en Rails
06:20 min - 20

Flujo de Autenticación en APIs con Tokens y Proveedores
05:29 min - 21

Tests con RSpec para autenticación de tokens
Viendo ahora - 22

Autenticación con Tokens: Implementación en Rails API
05:53 min - 23

Autenticación de Usuarios en Controladores Rails
09:19 min - 24

Autenticación y Seguridad en CRUD de Posts en Rails
09:17 min - 25

Pruebas de Creación y Actualización con Autenticación en Rails
14:21 min - 26

Probando API Ruby on Rails con Postman
10:43 min - 27

Caching en Aplicaciones Web: Funciones y Niveles
07:15 min - 28

Aceleración de Búsquedas en Rails con Caching
08:23 min - 29

Background Jobs en Rails: Conceptos y Funcionalidades
05:45 min - 30

Procesamiento en Background y Envío de Correos con Rails
09:45 min - 31

Envío de Correos en Rails con ActionMailer y Background Jobs
11:06 min - 32
Autenticación y Autorización con JWT y Auth0 en Aplicaciones Web
03:48 min
Cierre
Implementar autenticación con tokens en un API requiere pruebas enfocadas y repetibles. Aquí se construye, con Test Driven Development, una suite en RSpec que valida el acceso a posts según su visibilidad y la identidad del usuario, usando headers de Authorization, context y subject para asegurar un payload y response correctos.
¿Qué objetivo tiene la autenticación con tokens en el API?
El objetivo es crear una implementación propia basada en tokens y empezar por las pruebas. Se separa el alcance en tres endpoints: detalle, creación y actualización. Se inicia por el de detalle, que resulta más directo. Para organizar, se crea un nuevo archivo de pruebas dedicado a posts con autenticación y se aprovecha context para describir escenarios.
En el flujo planteado se prioriza: - Empezar por pruebas y dejar que fallen primero. - Aislar el recurso de posts que requiere autenticación. - Dividir por endpoints y por visibilidad del post: público o borrador. - Probar acceso a contenido de otro usuario y del mismo usuario.
¿Cómo se estructura la suite de pruebas con RSpec?
Se organiza el spec con bloques describe y context para expresar intención. Se usan let para datos de prueba, subject para enfocar las expectativas en response y payload, y se simulan requests con get hacia el endpoint de detalle.
¿Cómo se preparan los datos con factory bot y let?
Se generan dos usuarios y al menos un post por cada uno. En los posts se referencia explícitamente el user_id para diferenciar autorías. Esto permite cubrir el caso de “post de otro autor” y “post del mismo usuario”.
# private_posts_spec.rb
RSpec.describe 'Posts with authentication', type: :request do
describe 'GET /posts/:id' do
context 'with authentication' do
let(:user) { create(:user) }
let(:other_user) { create(:user) }
let(:user_post) { create(:post, user_id: user.id) }
let(:other_user_post) { create(:post, user_id: other_user.id) }
# Variante publicada y borrador del post de otro autor.
let(:public_post) { other_user_post } # aquí garantiza que esté publicado.
let(:draft_post) { other_user_post } # aquí configura que sea borrador.
# ...
end
end
end
¿Cómo se modelan los headers de autenticación en HTTP?
La autenticación viaja en un header adicional: Authorization. Por convención, el valor comienza con "bitter" seguido del token. Se define como un hash para pasarlo al request y se crean variantes para cada usuario.
let(:auth_headers) { { 'Authorization' => "bitter #{user.auth_token}" } }
let(:other_auth_headers) { { 'Authorization' => "bitter #{other_user.auth_token}" } }
Esta convención sigue lo usado en OAuth y permite enviar el token en cada request autenticado.
¿Cómo se usan context y subject para validar response y payload?
Se declara un subject para el response y otro para el payload. Así, las expectativas quedan expresivas y centradas en el objeto bajo prueba.
subject(:response) { super() }
subject(:payload) { JSON.parse(response.body) }
context 'when asking for other author post' do
context 'when post is public' do
before { get "/posts/#{public_post.id}", headers: auth_headers }
it 'incluye el id en el payload' do
expect(payload).to include('id' => public_post.id)
end
it 'responde con status ok' do
expect(response).to have_http_status(:ok)
end
end
context 'when post is draft' do
before { get "/posts/#{draft_post.id}", headers: auth_headers }
it 'incluye un error en el payload' do
expect(payload).to include('error')
end
it 'responde con not found' do
expect(response).to have_http_status(:not_found)
end
end
end
¿Qué comportamientos se validan en el endpoint de detalle?
Se cubren escenarios clave para restringir el acceso cuando corresponde y permitirlo cuando procede. La petición se realiza con get al endpoint posts/:id usando headers de autenticación válidos.
- Post público de otro autor: el payload incluye el
id. - Post público de otro autor: el response tiene status ok.
- Post en borrador de otro autor: el payload incluye un
error. - Post en borrador de otro autor: el response devuelve not found.
- Se ejecutan las pruebas y fallan al inicio: falta implementar la lógica de autenticación.
Así, la suite define un contrato verificable antes de escribir la lógica. En el siguiente paso, se implementa la autenticación para que todas las expectativas pasen.
¿Agregarías más casos, como acceso al post del mismo usuario o creación y actualización? Deja tus ideas y dudas en los comentarios.