develop #3

Merged
kbe merged 227 commits from develop into main 2025-09-16 14:35:23 +00:00
6 changed files with 67 additions and 62 deletions
Showing only changes of commit b228d5a174 - Show all commits

View File

@@ -111,7 +111,7 @@ class Event < ApplicationRecord
new_event.state = :draft new_event.state = :draft
new_event.created_at = Time.current new_event.created_at = Time.current
new_event.updated_at = Time.current new_event.updated_at = Time.current
Event.transaction do Event.transaction do
if new_event.save if new_event.save
# Duplicate all ticket types if requested # Duplicate all ticket types if requested

View File

@@ -40,13 +40,13 @@
<!-- Basic Information --> <!-- Basic Information -->
<div class="bg-white rounded-lg border border-gray-200 p-6"> <div class="bg-white rounded-lg border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-6">Informations générales</h3> <h3 class="text-lg font-semibold text-gray-900 mb-6">Informations générales</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6"> <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div> <div>
<%= form.label :name, "Nom de l'événement", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.label :name, "Nom de l'événement", class: "block text-sm font-medium text-gray-700 mb-2" %>
<%= form.text_field :name, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: Soirée d'ouverture", data: { "event-form-target": "name", action: "input->event-form#generateSlug" } %> <%= form.text_field :name, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: Soirée d'ouverture", data: { "event-form-target": "name", action: "input->event-form#generateSlug" } %>
</div> </div>
<div> <div>
<%= form.label :slug, "Slug (URL)", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.label :slug, "Slug (URL)", class: "block text-sm font-medium text-gray-700 mb-2" %>
<%= form.text_field :slug, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "soiree-ouverture", data: { "event-form-target": "slug" } %> <%= form.text_field :slug, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "soiree-ouverture", data: { "event-form-target": "slug" } %>
@@ -69,13 +69,13 @@
<!-- Date & Time --> <!-- Date & Time -->
<div class="bg-white rounded-lg border border-gray-200 p-6"> <div class="bg-white rounded-lg border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-6">Date et heure</h3> <h3 class="text-lg font-semibold text-gray-900 mb-6">Date et heure</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6"> <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div> <div>
<%= form.label :start_time, "Date et heure de début", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.label :start_time, "Date et heure de début", class: "block text-sm font-medium text-gray-700 mb-2" %>
<%= form.datetime_local_field :start_time, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" %> <%= form.datetime_local_field :start_time, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" %>
</div> </div>
<div> <div>
<%= form.label :end_time, "Date et heure de fin", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.label :end_time, "Date et heure de fin", class: "block text-sm font-medium text-gray-700 mb-2" %>
<%= form.datetime_local_field :end_time, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" %> <%= form.datetime_local_field :end_time, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" %>
@@ -86,55 +86,39 @@
<!-- Venue Information --> <!-- Venue Information -->
<div class="bg-white rounded-lg border border-gray-200 p-6"> <div class="bg-white rounded-lg border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-6">Lieu de l'événement</h3> <h3 class="text-lg font-semibold text-gray-900 mb-6">Lieu de l'événement</h3>
<!-- Geocoding Messages Container --> <!-- Geocoding Messages Container -->
<div data-event-form-target="messagesContainer" class="space-y-3 mb-6 empty:mb-0 empty:hidden"></div> <div data-event-form-target="messagesContainer" class="space-y-3 mb-6 empty:mb-0 empty:hidden"></div>
<div class="space-y-6"> <div class="space-y-6">
<div> <div>
<%= form.label :venue_name, "Nom du lieu", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.label :venue_name, "Nom du lieu", class: "block text-sm font-medium text-gray-700 mb-2" %>
<%= form.text_field :venue_name, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: Le Grand Rex" %> <%= form.text_field :venue_name, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: Le Grand Rex" %>
</div> </div>
<div> <div>
<%= form.label :venue_address, "Adresse complète", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.label :venue_address, "Adresse complète", class: "block text-sm font-medium text-gray-700 mb-2" %>
<div class="space-y-2"> <div class="space-y-2">
<div class="relative"> <div class="relative">
<%= form.text_field :venue_address, class: "w-full px-4 py-2 pr-12 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: 1 Boulevard Poissonnière, 75002 Paris", data: { "event-form-target": "address", action: "input->event-form#addressChanged" } %> <%= form.text_field :venue_address, class: "w-full px-4 py-2 pr-12 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: 1 Boulevard Poissonnière, 75002 Paris", data: { "event-form-target": "address", action: "input->event-form#addressChanged" } %>
<!-- Geocoding Loading Spinner --> <!-- Geocoding Loading Spinner -->
<div data-event-form-target="geocodingSpinner" class="absolute right-3 top-1/2 transform -translate-y-1/2 hidden"> <div data-event-form-target="geocodingSpinner" class="absolute right-3 top-1/2 transform -translate-y-1/2 hidden">
<div class="w-5 h-5 border-2 border-purple-200 border-t-purple-600 rounded-full animate-spin"></div> <div class="w-5 h-5 border-2 border-purple-200 border-t-purple-600 rounded-full animate-spin"></div>
</div> </div>
</div> </div>
<!-- Location Actions -->
<div class="flex flex-wrap gap-2">
<button type="button" data-action="click->event-form#getCurrentLocation" data-event-form-target="getCurrentLocationBtn" class="inline-flex items-center px-3 py-2 text-xs font-medium text-white bg-green-600 rounded-lg hover:bg-green-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
<span data-event-form-target="getCurrentLocationIcon">
<i data-lucide="map-pin" class="w-3 h-3 mr-1"></i>
</span>
<span data-event-form-target="getCurrentLocationText">Ma position</span>
</button>
<button type="button" data-action="click->event-form#previewLocation" data-event-form-target="previewLocationBtn" class="inline-flex items-center px-3 py-2 text-xs font-medium text-purple-700 bg-purple-50 border border-purple-200 rounded-lg hover:bg-purple-100 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
<span data-event-form-target="previewLocationIcon">
<i data-lucide="map" class="w-3 h-3 mr-1"></i>
</span>
<span data-event-form-target="previewLocationText">Prévisualiser</span>
</button>
</div>
</div> </div>
<p class="mt-2 text-sm text-gray-500"> <p class="mt-2 text-sm text-gray-500">
<i data-lucide="info" class="w-4 h-4 inline mr-1"></i> <i data-lucide="info" class="w-4 h-4 inline mr-1"></i>
Les coordonnées GPS seront automatiquement calculées à partir de cette adresse. Les coordonnées GPS seront automatiquement calculées à partir de cette adresse.
</p> </p>
</div> </div>
<!-- Hidden coordinate fields populated by JavaScript geocoding --> <!-- Hidden coordinate fields populated by JavaScript geocoding -->
<%= form.hidden_field :latitude, data: { "event-form-target": "latitude" } %> <%= form.hidden_field :latitude, data: { "event-form-target": "latitude" } %>
<%= form.hidden_field :longitude, data: { "event-form-target": "longitude" } %> <%= form.hidden_field :longitude, data: { "event-form-target": "longitude" } %>
<!-- Map Links Container (shown when address is valid) --> <!-- Map Links Container (shown when address is valid) -->
<div data-event-form-target="mapLinksContainer" class="empty:hidden bg-gray-50 rounded-lg p-3 border border-gray-200"></div> <div data-event-form-target="mapLinksContainer" class="empty:hidden bg-gray-50 rounded-lg p-3 border border-gray-200"></div>
</div> </div>
@@ -143,12 +127,25 @@
<!-- Options --> <!-- Options -->
<div class="bg-white rounded-lg border border-gray-200 p-6"> <div class="bg-white rounded-lg border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-6">Options</h3> <h3 class="text-lg font-semibold text-gray-900 mb-6">Options</h3>
<div class="flex items-center"> <div class="space-y-4">
<%= form.check_box :featured, class: "h-4 w-4 text-purple-600 border-gray-300 rounded focus:ring-purple-500" %> <div class="flex items-center">
<%= form.label :featured, "Mettre en avant sur la page d'accueil", class: "ml-2 text-sm text-gray-700" %> <%= form.check_box :featured, class: "h-4 w-4 text-purple-600 border-gray-300 rounded focus:ring-purple-500" %>
<%= form.label :featured, "Mettre en avant sur la page d'accueil", class: "ml-2 text-sm text-gray-700" %>
</div>
<p class="text-sm text-gray-500">Les événements mis en avant apparaissent en premier sur la page d'accueil.</p>
<div class="flex items-start">
<%= form.check_box :allow_booking_during_event, class: "h-4 w-4 text-purple-600 border-gray-300 rounded focus:ring-purple-500 mt-1" %>
<div class="ml-2">
<%= form.label :allow_booking_during_event, "Autoriser la réservation pendant l'événement", class: "text-sm text-gray-700 font-medium" %>
<p class="text-sm text-gray-500 mt-1">
Si activé, les participants pourront acheter des billets même après le début de l'événement.
Si désactivé, la vente de billets s'arrêtera automatiquement à l'heure de début.
</p>
</div>
</div>
</div> </div>
<p class="mt-2 text-sm text-gray-500">Les événements mis en avant apparaissent en premier sur la page d'accueil.</p>
</div> </div>
<!-- Actions --> <!-- Actions -->
@@ -158,7 +155,7 @@
Annuler Annuler
<% end %> <% end %>
</div> </div>
<div class="flex items-center space-x-3"> <div class="flex items-center space-x-3">
<%= form.submit "Créer en brouillon", class: "inline-flex items-center px-6 py-3 bg-gray-600 text-white font-medium rounded-lg hover:bg-gray-700 transition-colors duration-200" %> <%= form.submit "Créer en brouillon", class: "inline-flex items-center px-6 py-3 bg-gray-600 text-white font-medium rounded-lg hover:bg-gray-700 transition-colors duration-200" %>
</div> </div>
@@ -166,4 +163,3 @@
<% end %> <% end %>
</div> </div>
</div> </div>

View File

@@ -113,7 +113,7 @@
</div> </div>
<div class="flex-shrink-0"> <div class="flex-shrink-0">
<%= link_to event_path(@event.slug, @event), target: "_blank", class: "text-green-600 hover:text-green-800 font-medium text-sm whitespace-nowrap" do %> <%= link_to event_path(@event.slug, @event), target: "_blank", class: "text-green-600 hover:text-green-800 font-medium text-sm whitespace-nowrap" do %>
Voir publiquement <i data-lucide="external-link" class="w-4 h-4 inline ml-1"></i> Voir la fiche publique <i data-lucide="external-link" class="w-4 h-4 inline ml-1"></i>
<% end %> <% end %>
</div> </div>
</div> </div>
@@ -311,7 +311,7 @@
<p class="text-sm text-gray-500"> <p class="text-sm text-gray-500">
Choisissez les options de duplication pour "<%= @event.name %>". Choisissez les options de duplication pour "<%= @event.name %>".
</p> </p>
<div class="mt-4"> <div class="mt-4">
<div class="flex items-center"> <div class="flex items-center">
<input data-event-duplication-target="cloneTicketTypes" id="cloneTicketTypes" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" checked> <input data-event-duplication-target="cloneTicketTypes" id="cloneTicketTypes" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" checked>

View File

@@ -1,6 +1,15 @@
<% content_for(:title, "#{@ticket_type.name} - #{@event.name}") %> <% content_for(:title, "#{@ticket_type.name} - #{@event.name}") %>
<div class="container py-8"> <div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<!-- Breadcrumb -->
<%= render 'components/breadcrumb', crumbs: [
{ name: 'Dashboard', path: dashboard_path },
{ name: 'Événements', path: promoter_events_path },
{ name: @event.name, path: promoter_event_path(@event) },
{ name: 'Types de billets', path: promoter_event_ticket_types_path(@event) },
{ name: @ticket_type.name, path: nil }
] %>
<!-- Header with actions --> <!-- Header with actions -->
<div class="mb-8"> <div class="mb-8">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4"> <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">

View File

@@ -28,7 +28,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest
test "should duplicate an event with ticket types" do test "should duplicate an event with ticket types" do
sign_in @promoter sign_in @promoter
# Create ticket types for the event # Create ticket types for the event
ticket_type1 = TicketType.create!( ticket_type1 = TicketType.create!(
name: "Standard Ticket", name: "Standard Ticket",
@@ -39,7 +39,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest
sale_end_at: @event.start_time - 1.hour, sale_end_at: @event.start_time - 1.hour,
event: @event event: @event
) )
ticket_type2 = TicketType.create!( ticket_type2 = TicketType.create!(
name: "VIP Ticket", name: "VIP Ticket",
description: "A VIP ticket for the event with special access", description: "A VIP ticket for the event with special access",
@@ -49,27 +49,27 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest
sale_end_at: @event.start_time - 1.hour, sale_end_at: @event.start_time - 1.hour,
event: @event event: @event
) )
# Verify that ticket types were created successfully # Verify that ticket types were created successfully
assert ticket_type1.valid? assert ticket_type1.valid?
assert ticket_type2.valid? assert ticket_type2.valid?
# Duplicate the event # Duplicate the event
assert_difference('Event.count', 1) do assert_difference("Event.count", 1) do
post duplicate_promoter_event_path(@event), params: { clone_ticket_types: "true" } post duplicate_promoter_event_path(@event), params: { clone_ticket_types: "true" }
end end
# Check that the new event was created # Check that the new event was created
assert_redirected_to edit_promoter_event_path(Event.last) assert_redirected_to edit_promoter_event_path(Event.last)
assert_equal "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié.", flash[:notice] assert_equal "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié.", flash[:notice]
# Check that the new event has the correct attributes # Check that the new event has the correct attributes
new_event = Event.last new_event = Event.last
assert_equal "Copie de #{@event.name}", new_event.name assert_equal "Copie de #{@event.name}", new_event.name
assert_equal "draft", new_event.state assert_equal "draft", new_event.state
assert_equal @event.venue_name, new_event.venue_name assert_equal @event.venue_name, new_event.venue_name
assert_equal @event.venue_address, new_event.venue_address assert_equal @event.venue_address, new_event.venue_address
# Check that ticket types were duplicated # Check that ticket types were duplicated
assert_equal 2, new_event.ticket_types.count assert_equal 2, new_event.ticket_types.count
assert_equal "Standard Ticket", new_event.ticket_types.find_by(name: "Standard Ticket").name assert_equal "Standard Ticket", new_event.ticket_types.find_by(name: "Standard Ticket").name
@@ -78,7 +78,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest
test "should duplicate an event without ticket types" do test "should duplicate an event without ticket types" do
sign_in @promoter sign_in @promoter
# Create ticket types for the event # Create ticket types for the event
ticket_type1 = TicketType.create!( ticket_type1 = TicketType.create!(
name: "Standard Ticket", name: "Standard Ticket",
@@ -89,7 +89,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest
sale_end_at: @event.start_time - 1.hour, sale_end_at: @event.start_time - 1.hour,
event: @event event: @event
) )
ticket_type2 = TicketType.create!( ticket_type2 = TicketType.create!(
name: "VIP Ticket", name: "VIP Ticket",
description: "A VIP ticket for the event with special access", description: "A VIP ticket for the event with special access",
@@ -99,27 +99,27 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest
sale_end_at: @event.start_time - 1.hour, sale_end_at: @event.start_time - 1.hour,
event: @event event: @event
) )
# Verify that ticket types were created successfully # Verify that ticket types were created successfully
assert ticket_type1.valid? assert ticket_type1.valid?
assert ticket_type2.valid? assert ticket_type2.valid?
# Duplicate the event without ticket types # Duplicate the event without ticket types
assert_difference('Event.count', 1) do assert_difference("Event.count", 1) do
post duplicate_promoter_event_path(@event), params: { clone_ticket_types: "false" } post duplicate_promoter_event_path(@event), params: { clone_ticket_types: "false" }
end end
# Check that the new event was created # Check that the new event was created
assert_redirected_to edit_promoter_event_path(Event.last) assert_redirected_to edit_promoter_event_path(Event.last)
assert_equal "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié.", flash[:notice] assert_equal "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié.", flash[:notice]
# Check that the new event has the correct attributes # Check that the new event has the correct attributes
new_event = Event.last new_event = Event.last
assert_equal "Copie de #{@event.name}", new_event.name assert_equal "Copie de #{@event.name}", new_event.name
assert_equal "draft", new_event.state assert_equal "draft", new_event.state
assert_equal @event.venue_name, new_event.venue_name assert_equal @event.venue_name, new_event.venue_name
assert_equal @event.venue_address, new_event.venue_address assert_equal @event.venue_address, new_event.venue_address
# Check that ticket types were NOT duplicated # Check that ticket types were NOT duplicated
assert_equal 0, new_event.ticket_types.count assert_equal 0, new_event.ticket_types.count
end end

View File

@@ -275,21 +275,21 @@ class EventTest < ActiveSupport::TestCase
test "should duplicate event with ticket types" do test "should duplicate event with ticket types" do
user = User.create!(email: "test@example.com", password: "password123", password_confirmation: "password123") user = User.create!(email: "test@example.com", password: "password123", password_confirmation: "password123")
event = Event.create!(name: "Original Event", slug: "original", description: "A description that is sufficiently long", venue_name: "v", venue_address: "a", user: user, latitude: 48.0, longitude: 2.0, start_time: 1.week.from_now, state: :published) event = Event.create!(name: "Original Event", slug: "original", description: "A description that is sufficiently long", venue_name: "v", venue_address: "a", user: user, latitude: 48.0, longitude: 2.0, start_time: 1.week.from_now, state: :published)
# Create ticket types # Create ticket types
ticket_type1 = TicketType.create!(name: "Standard", description: "A standard ticket for the event", price_cents: 2000, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) ticket_type1 = TicketType.create!(name: "Standard", description: "A standard ticket for the event", price_cents: 2000, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event)
ticket_type2 = TicketType.create!(name: "VIP", description: "A VIP ticket for the event", price_cents: 5000, quantity: 50, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) ticket_type2 = TicketType.create!(name: "VIP", description: "A VIP ticket for the event", price_cents: 5000, quantity: 50, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event)
# Duplicate the event # Duplicate the event
duplicated_event = event.duplicate duplicated_event = event.duplicate
# Check that duplication was successful # Check that duplication was successful
assert_not_nil duplicated_event assert_not_nil duplicated_event
assert_equal "Copie de #{event.name}", duplicated_event.name assert_equal "Copie de #{event.name}", duplicated_event.name
assert_equal "draft", duplicated_event.state assert_equal "draft", duplicated_event.state
assert_equal event.venue_name, duplicated_event.venue_name assert_equal event.venue_name, duplicated_event.venue_name
assert_equal event.venue_address, duplicated_event.venue_address assert_equal event.venue_address, duplicated_event.venue_address
# Check that ticket types were duplicated # Check that ticket types were duplicated
assert_equal 2, duplicated_event.ticket_types.count assert_equal 2, duplicated_event.ticket_types.count
assert_equal "Standard", duplicated_event.ticket_types.find_by(name: "Standard").name assert_equal "Standard", duplicated_event.ticket_types.find_by(name: "Standard").name
@@ -299,21 +299,21 @@ class EventTest < ActiveSupport::TestCase
test "should duplicate event without ticket types" do test "should duplicate event without ticket types" do
user = User.create!(email: "test@example.com", password: "password123", password_confirmation: "password123") user = User.create!(email: "test@example.com", password: "password123", password_confirmation: "password123")
event = Event.create!(name: "Original Event", slug: "original", description: "A description that is sufficiently long", venue_name: "v", venue_address: "a", user: user, latitude: 48.0, longitude: 2.0, start_time: 1.week.from_now, state: :published) event = Event.create!(name: "Original Event", slug: "original", description: "A description that is sufficiently long", venue_name: "v", venue_address: "a", user: user, latitude: 48.0, longitude: 2.0, start_time: 1.week.from_now, state: :published)
# Create ticket types # Create ticket types
ticket_type1 = TicketType.create!(name: "Standard", description: "A standard ticket for the event", price_cents: 2000, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) ticket_type1 = TicketType.create!(name: "Standard", description: "A standard ticket for the event", price_cents: 2000, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event)
ticket_type2 = TicketType.create!(name: "VIP", description: "A VIP ticket for the event", price_cents: 5000, quantity: 50, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) ticket_type2 = TicketType.create!(name: "VIP", description: "A VIP ticket for the event", price_cents: 5000, quantity: 50, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event)
# Duplicate the event without ticket types # Duplicate the event without ticket types
duplicated_event = event.duplicate(clone_ticket_types: false) duplicated_event = event.duplicate(clone_ticket_types: false)
# Check that duplication was successful # Check that duplication was successful
assert_not_nil duplicated_event assert_not_nil duplicated_event
assert_equal "Copie de #{event.name}", duplicated_event.name assert_equal "Copie de #{event.name}", duplicated_event.name
assert_equal "draft", duplicated_event.state assert_equal "draft", duplicated_event.state
assert_equal event.venue_name, duplicated_event.venue_name assert_equal event.venue_name, duplicated_event.venue_name
assert_equal event.venue_address, duplicated_event.venue_address assert_equal event.venue_address, duplicated_event.venue_address
# Check that ticket types were NOT duplicated # Check that ticket types were NOT duplicated
assert_equal 0, duplicated_event.ticket_types.count assert_equal 0, duplicated_event.ticket_types.count
end end