Hello world (health endpoint)

6/33
Recursos

Aportes 16

Preguntas 6

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

**Buenas practicas en Ruby **

Me preguntaba, si en algunos videos nos instan a implementar buenas practicas o las convenciones utilizadas por la comunidad de Ruby y Ruby on Rails, ademas de algunas gemas como rubocop, en las cuales nos indican que se deber铆a utilizar 鈥single quotes鈥 para situaciones donde no debamos interpolar o Ruby no deba hacer una inspeccion del codigo.

Mi pregunta es: porque en el c贸digo que estamos escribiendo utilizamos comillas dobles para informaci贸n que no debemos interpolar o Ruby no deber铆a inspeccionar. Hay alguna convenci贸n espec铆fica para cuando escribimos tests?

require "rails_helper"

RSpec.describe "Health endpoint", type: :request do

  describe "GET /health" do
    before { get '/health' }

    it "should return OK" do
      payload = JSON.parse(response.body)
      expect(payload).not_to be_empty
      expect(payload['api']).to eq('OK')
    end

    it "should return status code 200" do
      expect(response).to have_http_status(200)
    end
  end
end```

Si a alguien tiene Ruby 3.0.0 con Rails 6, y se le presenta el error:

Error: example.run name is not available from within an example (e.g. an it block) or from constructs that run in the scope of an example (e.g. before, let, etc).

La soluci贸n que funcion贸 para mi fue ir al Gemfile y cambiar la versi贸n de la gema 鈥渞spec-rails鈥 de 3.5 a 4.0. Saludos!

Puede que para algunos no sea claro por qu茅 usa el comando:
RAILS_ENV=test rails c
En vez de usar simplemente
rails c
Y la raz贸n est谩 en el gemfile, en esa consola va a usar la gema FactoryBot, que si recordamos, solo fue definida para el ambiente de test, al correr el rails c solito, abrir铆a una consola del ambente development

group :test do
  gem 'factory_bot_rails', '~> 4.0'
  ...
end

no me funcion el:

have_http_200

tuve que usar:

have_http_status(:ok)

Esto en rails 6

si obtienen un error de tipo

Failure/Error: example.run
name is not available from within an example (e.g. an it block)

actualicen sus gemas de test a la ultima version en mi caso fallaba por que Rspec con versiones <4 en rails 6 tiene problemas

Tambien hay una gema muy util para esto health_check

leyendo sobre buenas practicas que sugieren al momento de desarrollar APIs que cumplan el concepto de REST.

Mi duda seria si ya tengo un HealthController y sugiriendo la convenci贸n de REST el metodo que de respuesta no quedaria mejor en un metodo index?

health_controller.rb

class HealthController < ApplicationController
  def index
    render json: { api: 'OK' }, status: :ok
  end
end

routes.rb

Rails.application.routes.draw do
  get '/health', to 'health#index'
end

驴Qu茅 opiniones o sugerencias han tenido siguiendo estas convenciones de REST?

Test

require 'rails_helper'

RSpec.describe 'Health endpoint', type: :request do

  describe 'GET /health' do
    before { get '/health' }

    it 'returns OK' do
      payload = JSON.parse(response.body)
      expect(payload).not_to be_empty
      expect(payload['api']).to eq('OK')
    end

    it 'does not return OK' do
      expect(response).to have_http_status(:ok)
    end
  end
end

Si tienen alg煤n error similar a

Failure/Error: example.run
       `name` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block).

Actualicen la gema de rspec-rails a 4.0

  gem 'rspec-rails', '~> 4.0'

create health request spec, me too use rails g rspec:request health

Como este curso es introductorio pues se foca mas en mostrar las bases, entonces es diferente de la vida real. API es bastante complexo, inclusive, tanto que en esta clase lo que se hizo fue demostrar que es una buena practica tener el health end point, pero para que esto sirva en la vida real, se tendria que mockar en los test y hacer el codigo de procesamiento del json en el model, (siendo que API no acostumbra usar controller practicamente). Mockar es como fingir esta interaccion entre nuestra api e una app externa que se comunica, esto retorno un archivo json, entonces tambien tendria que haber un json en la carpeta support de spec para fingir el retorno.
Lo que hizo fue que el controller retorno una resposta JSON, entonces no se cumple el din de una API que es la comunicacion con softwares externos.
Y aun restaria testear los caso de no sucesso, que es muy importante tambine.
Aqui les dejo una expicaci贸n de API en la Guia Rails, directo de la documentaci贸n oficial.

para rails 7:
GEMFILE:

group :test do
gem 'factory_bot_rails鈥
gem 鈥榮houlda-matchers鈥 , '~> 5.0鈥
gem 'faker鈥
gem 'database_cleaner-active_record鈥
end

rails_helper.rb:

Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec

# Keep as many of these lines as are necessary:
with.library :active_record
with.library :active_model
with.library :rails
with.library :action_controller

end
end

Si est谩n siguiendo tal cual el video y est谩n usando rails 6, y sienten que les sale error, es porque tienen que actualizar el rspec a 4.0. en el gemfile.

si depronto les sale este error: Health endpoint GET /health should return status code 200 Failure/Error: example.runnameis not available from within an example (e.g. anitblock) or from constructs that run in the scope of an example (e.g.before,let, etc). It is only available on an example group (e.g. adescribeorcontextblock).
Les recomiendo actualizar su gema de rspec a la versi贸n 4.0
gem 鈥榬spec-rails鈥, 鈥榽> 4.0鈥

Aqui cabe anotar dos cosas:

  1. Que aunque los modelos se definen en singular, las tablas deben ser creadas en plural (users y posts)
  2. Un blog podr铆a tener m谩s tablas, como comentarios o etiquetas.

Genial rspect. cumple con ser auto-documentado 馃憦