Permette titolo, testo e link diversi per Android e iOS negli avvisi.

Separa i canali app e mostra il nodo ingest nelle sessioni admin.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-20 16:09:04 +02:00
co-authored by Cursor
parent 43d5003de8
commit a07f231417
24 changed files with 366 additions and 69 deletions
+40 -6
View File
@@ -10,7 +10,8 @@ RSpec.describe AppAnnouncement do
status: "published",
title: "Avviso",
body: "Testo",
show_on_app: true,
show_on_android: true,
show_on_ios: true,
show_on_web_public: false,
show_on_web_private: false
}.merge(attrs))
@@ -35,22 +36,55 @@ RSpec.describe AppAnnouncement do
it "filters by selected channels" do
public_item = create_notice!(
title: "Pubblico", show_on_app: false, show_on_web_public: true
title: "Pubblico", show_on_android: false, show_on_ios: false, show_on_web_public: true
)
private_item = create_notice!(
title: "Privato", show_on_app: false, show_on_web_private: true
title: "Privato", show_on_android: false, show_on_ios: false, show_on_web_private: true
)
app_item = create_notice!(title: "App")
android_item = create_notice!(title: "Android", show_on_ios: false)
ios_item = create_notice!(title: "iOS", show_on_android: false, show_on_ios: true)
expect(described_class.for_channel(:web_public)).to contain_exactly(public_item)
expect(described_class.for_channel(:web_private)).to contain_exactly(private_item)
expect(described_class.for_app).to contain_exactly(app_item)
expect(described_class.for_platform("android")).to contain_exactly(android_item)
expect(described_class.for_platform("ios")).to contain_exactly(ios_item)
expect(described_class.for_app).to contain_exactly(android_item, ios_item)
end
it "uses platform-specific copy and links when present" do
item = create_notice!(
title: "Comune",
body: "Testo comune",
action_url: "https://example.com/comune",
action_label: "Apri",
android_title: "Aggiorna su Android",
android_body: "Apri Play Store",
android_action_url: "https://play.google.com/store/apps/details?id=com.matchlivetv.match_live_tv",
android_action_label: "Play Store",
ios_title: "Aggiorna su iOS",
ios_body: "Apri App Store",
ios_action_url: "https://apps.apple.com/app/id000",
ios_action_label: "App Store"
)
android = item.as_api_json(platform: "android")
ios = item.as_api_json(platform: "ios")
expect(android[:title]).to eq("Aggiorna su Android")
expect(android[:body]).to eq("Apri Play Store")
expect(android[:action_url]).to include("play.google.com")
expect(android[:action_label]).to eq("Play Store")
expect(ios[:title]).to eq("Aggiorna su iOS")
expect(ios[:body]).to eq("Apri App Store")
expect(ios[:action_url]).to include("apps.apple.com")
expect(ios[:action_label]).to eq("App Store")
end
it "requires at least one channel" do
item = described_class.new(
kind: "info", status: "draft", title: "X", body: "Y",
show_on_app: false, show_on_web_public: false, show_on_web_private: false
show_on_android: false, show_on_ios: false,
show_on_web_public: false, show_on_web_private: false
)
expect(item).not_to be_valid
expect(item.errors[:base]).to be_present