Store resource

This commit is contained in:
2026-08-18 13:04:21 +02:00
parent c85148d238
commit 4dccb9a815
12 changed files with 226 additions and 1 deletions
@@ -0,0 +1,35 @@
require "rails_helper"
RSpec.describe Api::StoresController, type: :request do
describe "GET /api/stores" do
it "lists stores without a login, in name order" do
create(:store, name: "Zed Games", catalog_url: "https://zed.example")
create(:store, name: "Apex Games", catalog_url: "https://apex.example")
get "/api/stores"
expect(response).to have_http_status(:ok)
json = JSON.parse(response.body)
expect(json.map { |s| s["name"] }).to eq(["Apex Games", "Zed Games"])
end
it "answers with the fields a client needs, camelCased" do
create(:store)
get "/api/stores"
store = JSON.parse(response.body).first
expect(store).to include("name", "catalogUrl", "storeRepositoryUrl")
expect(store["catalogUrl"]).to eq("https://teletypegames.org")
expect(store["storeRepositoryUrl"]).to end_with("/stores/ttg-desktop-store")
end
it "leaves out soft-deleted stores" do
create(:store, name: "Gone").update!(deleted_at: Time.current)
get "/api/stores"
expect(JSON.parse(response.body)).to be_empty
end
end
end
+7
View File
@@ -0,0 +1,7 @@
FactoryBot.define do
factory :store do
name { "Teletype Games" }
catalog_url { "https://teletypegames.org" }
store_repository_url { "https://git.teletypegames.org/stores/ttg-desktop-store" }
end
end
+33
View File
@@ -0,0 +1,33 @@
require "rails_helper"
RSpec.describe Store, type: :model do
it { should validate_presence_of(:name) }
it { should validate_presence_of(:catalog_url) }
it { should validate_presence_of(:store_repository_url) }
it "rejects a catalog url that is not http(s)" do
store = build(:store, catalog_url: "git@example.org:thing.git")
expect(store).not_to be_valid
expect(store.errors[:catalog_url]).to include("must be an http(s) URL")
end
it "rejects a repository url that is not http(s)" do
expect(build(:store, store_repository_url: "not a url")).not_to be_valid
end
describe ".ordered" do
it "lists stores by name" do
later = create(:store, name: "Zed Games")
first = create(:store, name: "Apex Games")
expect(Store.ordered).to eq([first, later])
end
end
it "hides soft-deleted stores" do
store = create(:store)
store.update!(deleted_at: Time.current)
expect(Store.all).to be_empty
end
end