No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Preparando nuestro entorno para base de datos

11/17
Recursos

Aportes 9

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Asi seria la conexión mysql + cypress 12:

npm install mysql2 --save-dev

//cypress.config.js
const { defineConfig } = require('cypress');
const mysql = require('mysql2');

function queryTestDB(query) {
  const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '*******',
    database: 'MiDataBase',
  });
  connection.connect();

  return new Promise((resolve, reject) => {
    connection.query(query, (error, results) => {
      if (error) reject(error);
      else {
        connection.end();
        return resolve(results);
      }
    });
  });
}

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on) {
      on('task', {
        queryDB: (query) => {
          return queryTestDB(query);
        },
      });
    },
  },
});


//Test
describe('Haremos una conexión con MySQL', () => {
  it('Debe obtener los resultados de una consulta', () => {
    cy.task('queryDB', 'SELECT * FROM ACTOR').then(
      (result) => {
        expect(result.length).to.equal(4);
      }
    );
  });
});

Con este código y mysql en un contenedor docker pude correr las pruebas en la version 12, aunque no me cargan las variables de entorno 😦.

Config:

const { defineConfig } = require("cypress");
const mysql = require('mysql')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task',{

        queryTestDb:function(query,config) {
          const connection = mysql.createConnection({
            "user":"root",
            "password":"example",
            "database":"db"
        })
          connection.connect()

          return new Promise((resolve, reject) => {
            connection.query(query,(err,results)=>{
              if(err){
                reject(err)
              } else {

                connection.end()
                return resolve(results)
              }
            })
          })
        }
      })
      // implement node event listeners here
    },
    excludeSpecPattern: [
      "cypress/e2e/getting-started/*.js",
      "cypress/e2e/advanced-examples/*.js",
    ],
    baseUrl:""
  }
});

Create dummy DATABASE

CREATE DATABASE people (id int,name varchar(255));

Test:

describe('testing database', () => {

    it('select',()=>{
        cy.task('queryTestDb',"select * from people").then((response)=>{
            cy.log(response)
        })

    })
})

Prisma ORM con Cypress

.
Para este efecto, partimos de que poseemos una abstracción como clase de Prisma o mediante la abstracción del 🔗 Prisma client.
.
Para poder probar ciertos casos de uso, podemos utilizar los eventos de Cypress mediante 📚 Plugins. Por lo que primero, empezamos a escribir nuestro plugin.
.

Nota. Para la versión 10 de Cypresss, la generación de plugins dentro de la carpeta plugin esta descontinuada y soportada en el archivo cypress.config.

.
Definiendo nuestro Plugin:

import {defineConfig} from 'cypress'
import Prisma from './src/libs/Prisma'

export default defineConfig({
    e2e: {
        baseUrl: 'URL',
        setupNodeEvents(on, _) {
            on('task', {
                findMany: ({model, query}) => {
                    const client = new Prisma(model)
                    return client.findMany(query)
                },
            })
        }
    }
})

De aquí importa la forma en cómo abstraemos nuestra Librería / ORM / Driver para que según sea el caso, mock o instancia, usemos la definición apropiada.
.
Luego, escribimos nuestra(s) prueba(s):

interface IPost {
    title: string
    text: string
    author: string
}

const findPosts = (posts: IPost[]) => {
    expect(posts).to.be.an('array')
    expect(posts).to.have.length.of.at.least(1)
    posts.forEach((post: IPost) => {
        expect(post).to.have.property('title')
        expect(post).to.have.property('text')
        expect(post).to.have.property('author')
    })
}

describe("Testing Prisma", () => {
    it("should works to find many posts", function () {
        cy.task("findMany", {model: 'post', query: {}})
            .then((result: any) => findPosts(result));
    });
});

En mi caso, me interesa evaluar el formato de respuesta que me entrega Prisma mediante findMany, lo que me permite evaluar la siguiente estructura de esquema:

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  text      String
  author    String
  createdAt DateTime @default(now())
  updatedAt DateTime @default(now())

  @@map("post")
}

Si no utilizan recurrentemente MySql, es posible se encuentren con errores varios de configuración. Uno de ellos, y según mi experiencia el más recurrente al inicio, es: “Client does not support authentication protocol requested by server; consider upgrading MySQL client”, para corregirslo, solo ejecuten la siguiente query :
" ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’; "
en donde deben reemplazar ‘password’ por la contraseña a usar en las pruebas.

Estuve siguiendo el curso pero usando la version 12 de Cypress. Varias cosas cambian entre esta versión y la que se usó en el curso pero los comentarios de los compañeros fueron de mucha ayuda 😃

Para las clases que requieren mongodb y mysql utilicé Docker, en el readme dejé algunos comentarios de como crear los contenedores.

https://github.com/difergo/cypressWorkshop

mi codigo: <https://github.com/celioso/Cursos-de-Platzi/tree/main/CursoDeAutomatizacionDePruebasDeBackendConCypress>
No olviden agregar en las credenciales para conectarse a la base de datos mysql el `"port" = "XXXX"` en mi caso uso un puerto diferente al 3306 y daba un AggregatedError a la hora de correr la prueba
En el archivo `cypress.config.js` ```bash ```

¡Hola!
La razón de que no carga las variables de entorno es porque el config del callback setNodeEvents está vacío.
¿Saben por qué?