Cypress: test rejestracji z prawdziwą wiadomością e-mail

« Blog · Autor:

Test rejestracji zwykle kończy się w połowie. Formularz wypełniony, przycisk kliknięty, asercja na komunikat „sprawdź skrzynkę" — i tyle. Najważniejszy fragment, czyli czy odnośnik aktywacyjny w ogóle działa, zostaje nieprzetestowany.

Powód jest prozaiczny: test nie ma skrzynki. Poniżej sposób, żeby ją miał.

Na czym to polega

Zamiast wpisywać wymyślony adres, test tworzy prawdziwą skrzynkę przez API, używa jej w formularzu, a potem odpytuje ją, aż przyjdzie wiadomość. Z treści wyciąga odnośnik i przechodzi pod niego jak zwykły użytkownik.

Cała sztuka sprowadza się do trzech wywołań HTTP. cy.request() nie podlega ograniczeniom CORS, więc nie potrzeba żadnej wtyczki.

Polecenia pomocnicze

Klucz dostępu trzymaj w zmiennej środowiskowej, nie w repozytorium. Cypress czyta je przez Cypress.env().

// cypress/support/getsend.js
const API  = 'https://www.getsend.xyz/api/v1'
const kopf = { Authorization: `Bearer ${Cypress.env('GETSEND_KEY')}` }

Cypress.Commands.add('nowaSkrzynka', () =>
  cy.request({ method: 'POST', url: `${API}/inboxes`, headers: kopf }).its('body'))

Cypress.Commands.add('czekajNaMaila', (box, proby = 20) => {
  const lokal = box.address.split('@')[0]
  const pobierz = (zostalo) =>
    cy.request({ url: `${API}/inboxes/${lokal}/messages`, headers: kopf })
      .then((r) => {
        if (r.body.count > 0) return r.body.messages[0]
        if (zostalo <= 1) throw new Error('Wiadomosc nie przyszla')
        return cy.wait(3000).then(() => pobierz(zostalo - 1))
      })
  return pobierz(proby)
})

Sam test

it('konczy rejestracje przez odnosnik z wiadomosci', () => {
  cy.nowaSkrzynka().then((box) => {
    cy.visit('/rejestracja')
    cy.get('#email').type(box.address)
    cy.get('form').submit()

    cy.czekajNaMaila(box).then((m) => {
      const lokal = box.address.split('@')[0]
      cy.request({ url: `${API}/inboxes/${lokal}/messages/${m.id}`, headers: kopf })
        .then((r) => {
          const link = r.body.text.match(/https?:\/\/\S+/)[0]
          cy.visit(link)
          cy.contains('Konto potwierdzone')
        })
    })
  })
})

Trzy rzeczy, które warto wiedzieć

Odpytuj, nie czekaj na sztywno. cy.wait(10000) jest albo za krótkie i test miga, albo za długie i zestaw testów puchnie. Pętla z krótkimi odstępami kończy się, gdy wiadomość faktycznie przyjdzie.

Każdy test dostaje własną skrzynkę. Adres jest losowy i długi, więc testy uruchomione równolegle sobie nie przeszkadzają. Współdzielona skrzynka to najprostszy sposób na testy, które psują się tylko na serwerze ciągłej integracji.

Wyrażenie na odnośnik dopasuj do swojej aplikacji. Powyższe bierze pierwszy adres URL z treści tekstowej. Jeśli w stopce jest odnośnik do wypisania się i trafia wyżej, dopasuj wzorzec do konkretnej ścieżki, na przykład /confirm/.

Ograniczenia

Wiadomości znikają po siedmiu dniach, a limit to 60 nowych skrzynek i 3000 zapytań na godzinę. Do zestawu testów uruchamianego przy każdym zatwierdzeniu zmian wystarcza z zapasem. Klucz odbierzesz na stronie API, bezpłatnie i bez zakładania konta.