@@ -3232,6 +3232,103 @@ def test_shared_report_does_not_create_over_limit_followup(self) -> None:
32323232 service .followups .filter (type = CustomerFollowUp .Type .OVER_LIMIT ).exists ()
32333233 )
32343234
3235+ def test_expired_dedicated_report_creates_stop_followup (self ) -> None :
3236+ Package .objects .create (name = "community" , verbose = "Community support" , price = 0 )
3237+ package = Package .objects .create (
3238+ name = "dedicated:expired" ,
3239+ verbose = "Expired dedicated" ,
3240+ price = 100 ,
3241+ category = PackageCategory .PACKAGE_DEDICATED ,
3242+ )
3243+ customer = Customer .objects .create (user_id = - 1 , origin = PAYMENTS_ORIGIN )
3244+ service = Service .objects .create (
3245+ customer = customer , backup_repository = "already-configured"
3246+ )
3247+ subscription = service .subscription_set .create (
3248+ package = package ,
3249+ expires = timezone .now () - timedelta (days = 61 ),
3250+ )
3251+
3252+ self ._post_support_report (service , "https://expired.example.com" )
3253+
3254+ followup = service .followups .get (type = CustomerFollowUp .Type .EXPIRED_DEDICATED )
3255+ first_followup_id = followup .pk
3256+ first_report_id = followup .details ["report_id" ]
3257+ self .assertEqual (followup .customer , customer )
3258+ self .assertEqual (followup .details ["service_id" ], service .pk )
3259+ self .assertEqual (
3260+ followup .details ["contract_expired_at" ], subscription .expires .isoformat ()
3261+ )
3262+ self .assertEqual (followup .details ["site_url" ], "https://expired.example.com" )
3263+
3264+ self ._post_support_report (service , "https://expired.example.com" )
3265+
3266+ followup .refresh_from_db ()
3267+ self .assertEqual (followup .pk , first_followup_id )
3268+ self .assertNotEqual (followup .details ["report_id" ], first_report_id )
3269+ self .assertEqual (
3270+ service .followups .filter (
3271+ type = CustomerFollowUp .Type .EXPIRED_DEDICATED
3272+ ).count (),
3273+ 1 ,
3274+ )
3275+
3276+ subscription .expires = timezone .now () + timedelta (days = 30 )
3277+ subscription .save (update_fields = ["expires" ])
3278+ self ._post_support_report (service , "https://expired.example.com" )
3279+
3280+ self .assertFalse (
3281+ service .followups .filter (
3282+ type = CustomerFollowUp .Type .EXPIRED_DEDICATED
3283+ ).exists ()
3284+ )
3285+
3286+ def test_dedicated_report_waits_for_contract_grace_period (self ) -> None :
3287+ Package .objects .create (name = "community" , verbose = "Community support" , price = 0 )
3288+ package = Package .objects .create (
3289+ name = "dedicated:grace" ,
3290+ verbose = "Dedicated in grace period" ,
3291+ price = 100 ,
3292+ category = PackageCategory .PACKAGE_DEDICATED ,
3293+ )
3294+ customer = Customer .objects .create (user_id = - 1 , origin = PAYMENTS_ORIGIN )
3295+ service = Service .objects .create (customer = customer )
3296+ service .subscription_set .create (
3297+ package = package ,
3298+ expires = timezone .now () - timedelta (days = 59 ),
3299+ )
3300+
3301+ self ._post_support_report (service , "https://grace.example.com" )
3302+
3303+ self .assertFalse (
3304+ service .followups .filter (
3305+ type = CustomerFollowUp .Type .EXPIRED_DEDICATED
3306+ ).exists ()
3307+ )
3308+
3309+ def test_non_dedicated_report_does_not_create_stop_followup (self ) -> None :
3310+ Package .objects .create (name = "community" , verbose = "Community support" , price = 0 )
3311+ package = Package .objects .create (
3312+ name = "shared:expired" ,
3313+ verbose = "Expired shared hosting" ,
3314+ price = 100 ,
3315+ category = PackageCategory .PACKAGE_SHARED ,
3316+ )
3317+ customer = Customer .objects .create (user_id = - 1 , origin = PAYMENTS_ORIGIN )
3318+ service = Service .objects .create (customer = customer )
3319+ service .subscription_set .create (
3320+ package = package ,
3321+ expires = timezone .now () - timedelta (days = 61 ),
3322+ )
3323+
3324+ self ._post_support_report (service , "https://shared-expired.example.com" )
3325+
3326+ self .assertFalse (
3327+ service .followups .filter (
3328+ type = CustomerFollowUp .Type .EXPIRED_DEDICATED
3329+ ).exists ()
3330+ )
3331+
32353332 def test_support_rejects_invalid_report_payload (self ) -> None :
32363333 service = self .perform_support ()
32373334 report_count = service .report_set .count ()
0 commit comments