¿Qué es Mattermost?
De su web:
Mattermost is a flexible, open source messaging platform
that enables secure team collaboration
Piensa en Mattermost como una alternativa de código abierto a Slack. También viene incluido en las instalaciones on-premise de GitLab Omnibus.
¿Qué quiero conseguir?
Al intentar participar en Hacktoberfest 2019, elegí una incidencia de migración de Mattermost como primer objetivo para un PR:
Migrate tests from “model/system_test.go” to use testify
De qué va esta entrada
Esta entrada trata de mi experiencia contribuyendo (o no consiguiéndolo) a Mattermost.
Contribuir
Ponerse en contacto
Tras encontrar la incidencia en la que quería trabajar, me uní al servidor de build de Mattermost y pedí que me la asignaran comentando en la incidencia. La respuesta fue rápida y, por eso, ya me sentí bien recibido.
Configuración
Empecé a configurar el entorno de desarrollo según el artículo Developer Setup -> ArchLinux. Es bastante directo y funciona como se describe.
Para probar mi configuración, quise ejecutar los tests existentes como referencia. Por desgracia, no funcionó a la primera:
go: willnorris.com/go/imageproxy@v0.9.0 requires
cloud.google.com/go@v0.37.1 requires
go.opencensus.io@v0.19.1 requires
google.golang.org/genproto@v0.0.0-20181219182458-5a97ab628bfb requires
google.golang.org/grpc@v1.16.0 requires
github.com/golang/lint@v0.0.0-20190227174305-8f45f776aaf1: invalid pseudo-version: does not match version-control timestamp (2018-12-17T17:45:47Z)
En realidad, esto no es un error en la base de código de Mattermost, sino en la forma en que Go 1.13 gestiona la validación de marcas de tiempo en los módulos de Go. Así que volver temporalmente a Go 1.12 me sirvió. Por suerte, despliego Go en mi equipo con Ansible mediante un rol propio, y cambiar entre versiones de Go es cuestión de ejecutar un pequeño playbook.
Ejecutar todos los tests lleva su tiempo, y resultó que la suite completa con una configuración de desarrollo solo para el servidor no termina.
Como mi contribución afecta al paquete model, cambié al subdirectorio model y ejecuté go test ./... -v:
=== RUN TestAccessJson
--- PASS: TestAccessJson (0.00s)
=== RUN TestAccessIsValid
--- PASS: TestAccessIsValid (0.00s)
=== RUN TestAnalyticsRowJson
--- PASS: TestAnalyticsRowJson (0.00s)
=== RUN TestAnalyticsRowsJson
...
--- PASS: TestConfigDefaults (0.01s)
--- PASS: TestConfigDefaults/somewhere_nil_when_uninitialized (0.00s)
utils_test.go:725: config.ServiceSettings.SiteURL was nil
--- PASS: TestConfigDefaults/nowhere_nil_when_initialized (0.00s)
--- PASS: TestConfigDefaults/nowhere_nil_when_partially_initialized (0.01s)
PASS
ok github.com/mattermost/mattermost-server/model (cached)
? github.com/mattermost/mattermost-server/model/gitlab [no test files]
A partir de ahí tenía una base válida para mi implementación.
Implementación
La primera implementación fue sencilla: quitar tres líneas, añadir dos. Así, en lugar de esto:
if result.Name != "test" {
t.Fatal("Ids do not match")
}
el código queda ahora así (en el momento de escribir esto):
require.Equal(t, "test", result.Name, "ids do not match")
Y bien: ¡los tests seguían pasando! Para comprobar si fallaban, comparé temporalmente con test2 y falló como se esperaba.
¡Pull Request!
Ahora que el test seguía funcionando, creé un PR para integrar mis cambios en Mattermost.
Tras las revisiones, mi PR se fusionó y contribuí a mejorar un poco un software de código abierto.