Giter VIP home page Giter VIP logo

chat.io's Introduction

chat.io renovate-app badge cypress version cypress-data-session version

ci status CircleCI chat.io

Cypress.io testing for a chat application that requires auth

Videos

Blog posts

Presentations

Installation

$ npm install

You will need a MongoDB somewhere and a Redis instance. I assume the MongoDB is running in the cloud and the Redis is running locally in a Docker container.

Run the app

Using docker-compose

$ docker-compose up

Or you can run Redis and MongoDB separately

Using separate services

Start Redis

$ docker run -d -p 6379:6379 redis:alpine
$ MONGODB=... SESSION_SECRET=... npm start

Tip: use as-a to inject the above environment variables into a local / user profile file .as-a.init, something like this:

[chat.io]
SESSION_SECRET=MySecretVariable1234
MONGODB=mongodb://root:rootPass1234@localhost:27017/
$ as-a chat.io npm start

Open the http://localhost:3000 in your browser.

Chat between two users

Run the tests

Because Cypress connects to the same MongoDB to clear the data in some tests, need to start it with the same environment variable

$ MONGODB=... npx cypress open

Read Testing Mongo with Cypress

Tip: you can use as-a to start Cypress with environment variables to connect to the MongoDB locally

$ as-a chat.io npx cypress open

Start the app and run the tests

Using start-server-and-test utility you can start the application and open Cypress (assuming the services have been started)

# assuming injecting ENV variables using "as-a"
$ as-a chat.io npm run dev

Watching mode

This mode speeds the local development

Watching the server

You can start the application server in watch mode. Any file change will automatically restart the server. Uses nodemon

$ npm run watch

Watching the specs

The Cypress tests automatically re-run when the spec files change. They also re-run when any files in the public folder change thanks to the cypress-watch-and-reload plugin.

History

All props for this Chat app goes to the original repo OmarElGabry/chat.io. I have only cloned to show it being tested, added more features, added Cypress tests

Custom domain

By setting the "hosts" object in the cypress.json we can map custom domains back to the local machine and use them from Cypress tests. For example, the spec file my-chat-domain.js visits the http://my-chat.io:3000 which is mapped back to the 127.0.0.1:3000 inside the cypress.json file.

HTTPS

To create a local self-signed certificate on Mac I used the following commands (see Cypress Hosts Option and bahmutov/cypress-local-https)

$ brew install mkcert
$ mkcert -install
$ mkdir .cert
$ mkcert -key-file ./.cert/key.pem -cert-file ./.cert/cert.pem "my-chat.io"

To start the server with HTTPS, use

$ HTTPS=true ... start command ...

In this case, the base URL should point at https://my-chat.io with additional "hosts" mapping this custom domain back to 127.0.0.1

{
  "baseUrl": "https://my-chat.io:3000/",
  "hosts": {
    "my-chat.io": "127.0.0.1"
  }
}

Currently, the plugin file changes the base URL and sets the "hosts" object automatically when you launch Cypress with HTTPS=true environment variable.

For example, I use the following commands to test HTTPS and the custom domain

$ HTTPS=true as-a . npm start
# from another terminal open Cypress
$ HTTPS=true as-a . npx cypress open
# or using a single command via start-server-and-test
$ HTTPS=true as-a . npm run dev

Continuous Integration

The tests run automatically on pull requests, and the changed specs run first, read the blog post Get Faster Feedback From Your Cypress Tests Running On GitHub Actions. The tests run on GitHub Actions, see the workflows in .github/workflows folder. Similarly, the E2E changed tests run first on CircleCI, and if they pass, then all tests run with parallelization, see .circleci/config.yml file and read Get Faster Feedback From Your Cypress Tests Running On CircleCI

About me

chat.io's People

Contributors

bahmutov avatar lordagam avatar renovate-bot avatar renovate[bot] avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.