Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решен ие.
Для новичков, задача на пару дней
Недавно выпущенная библиотека 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");
});
});