Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Фронт: AnyCable JS: поддержка тестирования

Для новичков, задача на пару дней

Недавно выпущенная библиотека AnyCable JS является альтернативой стандартному пакету из Rails (@rails/actioncable). Она предоставляет более современный API и новые возможности для написания WebSocket-приложений, использующих Action Cable или AnyCable.

В AnyCable JS понятие канала абстрагировано от транспортного слоя (сокетов), что позволяет рассматривать классы каналов как обычные JS-классы. В свою очередь, это открывает возможности для создания инструментов unit-тестирования каналов — это мы и предлагаем попробовать реализовать.

Польза: получить опыт работы с JS/TS, разобраться в том, как устроены клиентские библиотеки для работы с Action Cable, принести пользу Rails-сообществу.

Инструкции по выполнению

Пример класса канала и соответствующего теста:

import { Channel } from "@anycable/core";

class ChatChannel extends Channel {
  static identifier = "ChatChannel";

  async speak(message) {
    return this.perform("speak", { message });
  }

  async leave() {
    // some custom logic
    return this.disconnect();
  }
}

// channel.test.ts
import { ChatChannel } from "./channel.js";
import { TestCable } from "@anycable/core/testing";

describe("ChatChannel", () => {
  let channel: ChatChannel;
  let cable: TestCable;

  beforeEach(() => {
    cable = new TestCable();
    channel = new ChatChannel({ id: "2021" });
    cable.subscribe(channel);
  });

  it("speak perform an action", async () => {
    await channel.speak("hello");

    expect(cable.outgoing).toEqual([{ message: "hello" }]);
  });

  it("disconnects when leave", () => {
    await channel.leave();

    expect(channel.state).toEqual("disconnected");
  });
});
  1. Задать вопросы или попросить уточнения в issue на GitHub.
  2. Форкнуть проект anycable-client на GitHub.
  3. Реализовать необходимый функционал.
  4. Сделать Pull Request.