@@ -2106,6 +2106,218 @@ def failed_privacy_request(db: Session, policy: Policy) -> PrivacyRequest:
21062106 pr .delete (db )
21072107
21082108
2109+ @pytest .fixture (scope = "function" )
2110+ def privacy_notice_targeted_advertising (db : Session ) -> Generator :
2111+ """
2112+ Privacy notice fixture for targeted advertising use cases.
2113+
2114+ Creates a privacy notice with targeted advertising data uses that can be used
2115+ to test matching with various cookie assets.
2116+ """
2117+ template = PrivacyNoticeTemplate .create (
2118+ db ,
2119+ check_name = False ,
2120+ data = {
2121+ "name" : "targeted advertising notice" ,
2122+ "notice_key" : "targeted_advertising_notice_1" ,
2123+ "consent_mechanism" : ConsentMechanism .opt_out ,
2124+ "data_uses" : [
2125+ "marketing.advertising.first_party.targeted" ,
2126+ "marketing.advertising.third_party.targeted" ,
2127+ ],
2128+ "enforcement_level" : EnforcementLevel .system_wide ,
2129+ "translations" : [
2130+ {
2131+ "language" : "en" ,
2132+ "title" : "Targeted Advertising Notice" ,
2133+ "description" : "Notice for targeted advertising" ,
2134+ }
2135+ ],
2136+ },
2137+ )
2138+ privacy_notice = PrivacyNotice .create (
2139+ db = db ,
2140+ data = {
2141+ "name" : "targeted advertising notice" ,
2142+ "notice_key" : "targeted_advertising_notice_1" ,
2143+ "consent_mechanism" : ConsentMechanism .opt_out ,
2144+ "data_uses" : [
2145+ "marketing.advertising.first_party.targeted" ,
2146+ "marketing.advertising.third_party.targeted" ,
2147+ ],
2148+ "enforcement_level" : EnforcementLevel .system_wide ,
2149+ "origin" : template .id ,
2150+ "translations" : [
2151+ {
2152+ "language" : "en" ,
2153+ "title" : "Targeted Advertising Notice" ,
2154+ "description" : "Notice for targeted advertising" ,
2155+ }
2156+ ],
2157+ },
2158+ )
2159+
2160+ yield privacy_notice
2161+
2162+ # Clean up translations and histories
2163+ for translation in privacy_notice .translations :
2164+ for history in translation .histories :
2165+ history .delete (db )
2166+ translation .delete (db )
2167+ privacy_notice .delete (db )
2168+ template .delete (db )
2169+
2170+
2171+ @pytest .fixture (scope = "function" )
2172+ def multi_data_use_cookie_asset (db : Session , system ) -> Generator :
2173+ """
2174+ Asset that mimics a real-world cookie with multiple data uses.
2175+ """
2176+ asset = Asset (
2177+ name = "_gcl_au" ,
2178+ asset_type = "Cookie" ,
2179+ domain = "*" ,
2180+ system_id = system .id ,
2181+ data_uses = [
2182+ "marketing.advertising.first_party.contextual" ,
2183+ "marketing.advertising.negative_targeting" ,
2184+ "analytics.reporting.campaign_insights" ,
2185+ "marketing.advertising.first_party.targeted" , # Should match targeted advertising notices
2186+ "analytics.reporting.ad_performance" ,
2187+ "functional.service.improve" ,
2188+ "marketing.advertising.third_party.targeted" , # Should match targeted advertising notices
2189+ "marketing.advertising.profiling" ,
2190+ "marketing.advertising.frequency_capping" ,
2191+ "functional.storage" ,
2192+ ],
2193+ locations = [],
2194+ parent = [],
2195+ consent_status = "unknown" ,
2196+ page = [],
2197+ )
2198+ asset .save (db )
2199+
2200+ yield asset
2201+
2202+ # Clean up
2203+ try :
2204+ asset .delete (db )
2205+ except ObjectDeletedError :
2206+ # Skip if already deleted
2207+ pass
2208+
2209+
2210+ @pytest .fixture (scope = "function" )
2211+ def privacy_notice_fun_data_use (db : Session ) -> Generator :
2212+ """
2213+ Privacy notice fixture for testing substring matching edge cases.
2214+
2215+ Creates a privacy notice with 'fun' data use to test against 'funding' assets.
2216+ """
2217+ template = PrivacyNoticeTemplate .create (
2218+ db ,
2219+ check_name = False ,
2220+ data = {
2221+ "name" : "fun activities notice" ,
2222+ "notice_key" : "fun_activities_notice_1" ,
2223+ "consent_mechanism" : ConsentMechanism .opt_in ,
2224+ "data_uses" : ["fun" ],
2225+ "enforcement_level" : EnforcementLevel .system_wide ,
2226+ "translations" : [
2227+ {
2228+ "language" : "en" ,
2229+ "title" : "Fun Activities Notice" ,
2230+ "description" : "Notice for fun activities" ,
2231+ }
2232+ ],
2233+ },
2234+ )
2235+ privacy_notice = PrivacyNotice .create (
2236+ db = db ,
2237+ data = {
2238+ "name" : "fun activities notice" ,
2239+ "notice_key" : "fun_activities_notice_1" ,
2240+ "consent_mechanism" : ConsentMechanism .opt_in ,
2241+ "data_uses" : ["fun" ],
2242+ "enforcement_level" : EnforcementLevel .system_wide ,
2243+ "origin" : template .id ,
2244+ "translations" : [
2245+ {
2246+ "language" : "en" ,
2247+ "title" : "Fun Activities Notice" ,
2248+ "description" : "Notice for fun activities" ,
2249+ }
2250+ ],
2251+ },
2252+ )
2253+
2254+ yield privacy_notice
2255+
2256+ # Clean up
2257+ for translation in privacy_notice .translations :
2258+ for history in translation .histories :
2259+ history .delete (db )
2260+ translation .delete (db )
2261+ privacy_notice .delete (db )
2262+ template .delete (db )
2263+
2264+
2265+ @pytest .fixture (scope = "function" )
2266+ def privacy_notice_empty_data_uses (db : Session ) -> Generator :
2267+ """
2268+ Privacy notice fixture with no data uses for testing edge cases.
2269+
2270+ Creates a privacy notice with empty data uses list to test that it returns
2271+ no cookies regardless of what cookie assets exist.
2272+ """
2273+ template = PrivacyNoticeTemplate .create (
2274+ db ,
2275+ check_name = False ,
2276+ data = {
2277+ "name" : "Empty Notice" ,
2278+ "notice_key" : "empty_notice_1" ,
2279+ "consent_mechanism" : ConsentMechanism .opt_in ,
2280+ "data_uses" : [], # Empty data uses
2281+ "enforcement_level" : EnforcementLevel .system_wide ,
2282+ "translations" : [
2283+ {
2284+ "language" : "en" ,
2285+ "title" : "Empty Notice" ,
2286+ "description" : "This notice has no data uses." ,
2287+ }
2288+ ],
2289+ },
2290+ )
2291+ privacy_notice = PrivacyNotice .create (
2292+ db = db ,
2293+ data = {
2294+ "name" : "Empty Notice" ,
2295+ "notice_key" : "empty_notice_1" ,
2296+ "consent_mechanism" : ConsentMechanism .opt_in ,
2297+ "data_uses" : [], # Empty data uses
2298+ "enforcement_level" : EnforcementLevel .system_wide ,
2299+ "origin" : template .id ,
2300+ "translations" : [
2301+ {
2302+ "language" : "en" ,
2303+ "title" : "Empty Notice" ,
2304+ "description" : "This notice has no data uses." ,
2305+ }
2306+ ],
2307+ },
2308+ )
2309+
2310+ yield privacy_notice
2311+
2312+ # Clean up
2313+ for translation in privacy_notice .translations :
2314+ for history in translation .histories :
2315+ history .delete (db )
2316+ translation .delete (db )
2317+ privacy_notice .delete (db )
2318+ template .delete (db )
2319+
2320+
21092321@pytest .fixture (scope = "function" )
21102322def privacy_notice_2 (db : Session ) -> Generator :
21112323 template = PrivacyNoticeTemplate .create (
0 commit comments