diff --git a/lib/ad_service/query/for_display.ex b/lib/ad_service/query/for_display.ex index 234ce3cc5..3d7f23f6d 100644 --- a/lib/ad_service/query/for_display.ex +++ b/lib/ad_service/query/for_display.ex @@ -2,7 +2,7 @@ defmodule AdService.Query.ForDisplay do import Ecto.Query alias AdService.UnrenderedAdvertisement alias CodeFund.Campaigns - alias CodeFund.Schema.{Audience, Campaign, Creative, Impression, Property} + alias CodeFund.Schema.{Campaign, Creative, Impression, Property} def fallback_ad_by_property_id(property_id) do from(property in Property, @@ -30,7 +30,7 @@ defmodule AdService.Query.ForDisplay do |> UnrenderedAdvertisement.one() end - def build(%Audience{} = audience, client_country, ip_address, excluded_advertisers \\ []) do + def build(%Property{} = property, client_country, ip_address, excluded_advertisers \\ []) do from( creative in Creative, join: campaign in Campaign, @@ -38,14 +38,44 @@ defmodule AdService.Query.ForDisplay do join: large_image_asset in assoc(creative, :large_image_asset), left_join: small_image_asset in assoc(creative, :small_image_asset), left_join: wide_image_asset in assoc(creative, :wide_image_asset), - join: audience in assoc(campaign, :audience), distinct: campaign.id ) |> where_country_in(client_country) |> AdService.Query.TimeManagement.where_accepted_hours_for_ip_address(ip_address) |> AdService.Query.TimeManagement.where_not_allowed_on_weekends(ip_address) |> with_daily_budget() - |> where([_creative, campaign, ...], campaign.audience_id == ^audience.id) + |> where( + [_creative, campaign, ...], + fragment( + "? && ?::varchar[]", + campaign.included_programming_languages, + ^property.programming_languages + ) + ) + |> where( + [_creative, campaign, ...], + fragment( + "? && ?::varchar[]", + campaign.included_topic_categories, + ^property.topic_categories + ) + ) + |> where( + [_creative, campaign, ...], + fragment( + "not ? && ?::varchar[]", + campaign.excluded_programming_languages, + ^property.programming_languages + ) + ) + |> where( + [_creative, campaign, ...], + fragment( + "not ? && ?::varchar[]", + campaign.excluded_topic_categories, + ^property.topic_categories + ) + ) |> where( [_creative, campaign, ...], campaign.id not in ^Campaigns.list_of_ids_for_companies(excluded_advertisers) diff --git a/lib/ad_service/server.ex b/lib/ad_service/server.ex index 957b2026f..7fe4bdfaf 100644 --- a/lib/ad_service/server.ex +++ b/lib/ad_service/server.ex @@ -13,13 +13,12 @@ defmodule AdService.Server do with {:ok, :no_cache_found} <- AdService.Impression.Cache.lookup(conn.remote_ip, property_id), {:ok, %{country: client_country}} <- Framework.Geolocation.find_by_ip(conn.remote_ip, :city), - %Property{status: 1, audience: audience} = property - when not is_nil(audience) <- - Properties.get_property!(property_id) |> CodeFund.Repo.preload([:user, :audience]), + %Property{status: 1} = property <- + Properties.get_property!(property_id) |> CodeFund.Repo.preload([:user]), :ok <- Framework.Browser.certify_human(conn), {:ok, ad_tuple} <- AdService.Query.ForDisplay.build( - audience, + property, client_country, conn.remote_ip, property.excluded_advertisers diff --git a/lib/code_fund/audiences/audiences.ex b/lib/code_fund/audiences/audiences.ex index 9aab1d602..7e48a84c4 100644 --- a/lib/code_fund/audiences/audiences.ex +++ b/lib/code_fund/audiences/audiences.ex @@ -132,12 +132,6 @@ defmodule CodeFund.Audiences do Audience.changeset(audience, %{}) end - def get_all_display_rates(%Audience{} = audience) do - AdService.Query.ForDisplay.build(audience, nil, nil) - |> CodeFund.Repo.all() - |> AdService.Math.Basic.get_all_display_rates() - end - defp filter_config(:audiences) do defconfig do text(:name) diff --git a/lib/code_fund/properties/properties.ex b/lib/code_fund/properties/properties.ex index 1eab521e1..0701ec864 100644 --- a/lib/code_fund/properties/properties.ex +++ b/lib/code_fund/properties/properties.ex @@ -139,8 +139,8 @@ defmodule CodeFund.Properties do def get_property_by_name!(name), do: Repo.get_by!(Property, name: name) |> Repo.preload([:user, :audience, :template]) - def get_all_display_rates(%Property{audience: audience}) when not is_nil(audience) do - AdService.Query.ForDisplay.build(audience, nil, nil) + def get_all_display_rates(%Property{} = property) do + AdService.Query.ForDisplay.build(property, nil, nil) |> CodeFund.Repo.all() |> AdService.Math.Basic.get_all_display_rates() end diff --git a/lib/code_fund_web/templates/audience/index.html.eex b/lib/code_fund_web/templates/audience/index.html.eex index 7342edb7a..1998e3c2b 100644 --- a/lib/code_fund_web/templates/audience/index.html.eex +++ b/lib/code_fund_web/templates/audience/index.html.eex @@ -24,7 +24,6 @@ Fallback Campaign <%= table_link(@conn, "Programming Languages", :programming_languages) %> <%= table_link(@conn, "Topic Categories", :topic_categories) %> - Advertisers @@ -35,13 +34,6 @@ <%= if audience.campaigns, do: audience.campaigns.name, else: "None" %> <%= truncate(audience.programming_languages |> Enum.join(", ")) %> <%= truncate(audience.topic_categories |> Enum.join(", ")) %> - - - <%= link 'Show', to: audience_path(@conn, :show, audience), class: "btn btn-outline-info btn-sm" %> <%= link 'Edit', to: audience_path(@conn, :edit, audience), class: "btn btn-outline-primary btn-sm" %> diff --git a/lib/code_fund_web/templates/property/index.html.eex b/lib/code_fund_web/templates/property/index.html.eex index 38ac7640d..460f8c825 100644 --- a/lib/code_fund_web/templates/property/index.html.eex +++ b/lib/code_fund_web/templates/property/index.html.eex @@ -52,6 +52,9 @@ <%= if has_any_role? @conn, ["admin", "developer"] do %> Excluded Advertisers <% end %> + <%= if has_any_role? @conn, ["admin"] do %> + Advertisers + <% end %> @@ -71,6 +74,15 @@ <%= if has_any_role? @conn, ["admin", "developer"] do %> <%= property.excluded_advertisers |> Enum.join(", ") %> <% end %> + <%= if has_any_role? @conn, ["admin"] do %> + + + + <% end %> <%= link 'Show', to: property_path(@conn, :show, property), class: "btn btn-outline-info btn-sm" %> <%= link 'Edit', to: property_path(@conn, :edit, property), class: "btn btn-outline-primary btn-sm" %> diff --git a/test/ad_service/query/for_display_test.exs b/test/ad_service/query/for_display_test.exs index e9c57d506..6d95f0639 100644 --- a/test/ad_service/query/for_display_test.exs +++ b/test/ad_service/query/for_display_test.exs @@ -29,6 +29,22 @@ defmodule AdService.Query.ForDisplayTest do topic_categories: ["Development"] }) + property = + insert(:property, %{ + programming_languages: ["Ruby", "C"], + topic_categories: ["Programming"] + }) + + insert(:property, %{ + programming_languages: ["Ruby", "C"], + topic_categories: ["Development"] + }) + + insert(:property, %{ + programming_languages: ["Ruby", "Rust"], + topic_categories: ["Programming"] + }) + campaign = insert( :campaign, @@ -40,6 +56,10 @@ defmodule AdService.Query.ForDisplayTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, audience: audience, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"], user: insert(:user, company: "Acme") ) @@ -54,6 +74,10 @@ defmodule AdService.Query.ForDisplayTest do end_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), creative: creative, audience: audience, + included_programming_languages: ["Rust"], + included_topic_categories: ["Development"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Programming"], included_countries: ["US"] ) @@ -66,6 +90,10 @@ defmodule AdService.Query.ForDisplayTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), total_spend: Decimal.new(100), creative: creative, + included_programming_languages: ["Rust"], + included_topic_categories: ["Development"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Programming"], included_countries: ["IN"], audience: insert(:audience, %{programming_languages: ["Java", "Rust"]}) ) @@ -80,12 +108,23 @@ defmodule AdService.Query.ForDisplayTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, audience: audience, + included_programming_languages: ["Rust"], + included_topic_categories: ["Development"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Programming"], included_countries: ["CN"] ) [cdn_host: cdn_host] = Application.get_env(:code_fund, Framework.FileStorage) - {:ok, %{audience: audience, creative: creative, campaign: campaign, cdn_host: cdn_host}} + {:ok, + %{ + audience: audience, + creative: creative, + campaign: campaign, + cdn_host: cdn_host, + property: property + }} end describe "fallback_ad_by_property_id/1" do @@ -122,13 +161,13 @@ defmodule AdService.Query.ForDisplayTest do end describe "build/1" do - test "get_by_property_filters excludes indicated countries", %{audience: audience} do - refute AdService.Query.ForDisplay.build(audience, "CN", nil, ["Foobar"]) + test "get_by_property_filters excludes indicated countries", %{property: property} do + refute AdService.Query.ForDisplay.build(property, "CN", nil, ["Foobar"]) |> CodeFund.Repo.one() end test "it returns advertisements by audience, included country and excluded advertisers", %{ - audience: audience, + property: property, campaign: campaign, creative: creative } do @@ -141,13 +180,16 @@ defmodule AdService.Query.ForDisplayTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"], user: insert(:user, company: "Foobar") ) advertisement = - AdService.Query.ForDisplay.build(audience, "US", nil, ["Foobar"]) + AdService.Query.ForDisplay.build(property, "US", nil, ["Foobar"]) |> CodeFund.Repo.one() small_image_asset = CodeFund.Schema.Asset |> Repo.get!(creative.small_image_asset.id) @@ -178,7 +220,7 @@ defmodule AdService.Query.ForDisplayTest do end test "it excludes campaigns which are not allowed on the weekends when its a weekend", %{ - audience: audience, + property: property, creative: creative } do CodeFund.Schema.Campaign @@ -195,7 +237,10 @@ defmodule AdService.Query.ForDisplayTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, weekdays_only: true, - audience: audience, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"], user: insert(:user, company: "Acme") ) @@ -203,14 +248,14 @@ defmodule AdService.Query.ForDisplayTest do TimeMachinex.ManagedClock.set(DateTime.from_naive!(~N[2018-09-22 11:00:00], "Etc/UTC")) advertisement = - AdService.Query.ForDisplay.build(audience, "US", {72, 229, 28, 185}, ["Foobar"]) + AdService.Query.ForDisplay.build(property, "US", {72, 229, 28, 185}, ["Foobar"]) |> CodeFund.Repo.one() refute advertisement end test "it will exclude campaigns that are over their daily budget", %{ - audience: audience, + property: property, creative: creative } do CodeFund.Schema.Campaign @@ -227,7 +272,10 @@ defmodule AdService.Query.ForDisplayTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"], user: insert(:user, company: "Acme") ) @@ -235,7 +283,7 @@ defmodule AdService.Query.ForDisplayTest do insert(:impression, campaign: campaign, revenue_amount: Decimal.new(9.5)) advertisement = - AdService.Query.ForDisplay.build(audience, "US", nil, ["Foobar"]) |> CodeFund.Repo.one() + AdService.Query.ForDisplay.build(property, "US", nil, ["Foobar"]) |> CodeFund.Repo.one() refute advertisement end diff --git a/test/ad_service/server_test.exs b/test/ad_service/server_test.exs index 1fa4c5477..538e51e14 100644 --- a/test/ad_service/server_test.exs +++ b/test/ad_service/server_test.exs @@ -32,15 +32,20 @@ defmodule AdService.ServerTest do audience_2 = insert(:audience, name: "wrong one") property = - insert( - :property, - audience: audience_1 - ) + insert(:property, %{ + programming_languages: ["Ruby", "C"], + topic_categories: ["Programming"] + }) - insert( - :property, - audience: audience_2 - ) + insert(:property, %{ + programming_languages: ["Ruby", "C"], + topic_categories: ["Development"] + }) + + insert(:property, %{ + programming_languages: ["Ruby", "Rust"], + topic_categories: ["Programming"] + }) assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 conn = conn |> Map.put(:remote_ip, {12, 109, 12, 14}) @@ -60,6 +65,10 @@ defmodule AdService.ServerTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, audience: audience_1, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) @@ -73,6 +82,10 @@ defmodule AdService.ServerTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, audience: audience_2, + included_programming_languages: ["Rust"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby", "C"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) @@ -123,20 +136,13 @@ defmodule AdService.ServerTest do TimeMachinex.ManagedClock.set(DateTime.from_naive!(~N[1985-10-26 11:00:00], "Etc/UTC")) creative = insert(:creative, small_image_asset: insert(:asset)) - audience_1 = insert(:audience, name: "right one") - audience_2 = insert(:audience, name: "wrong one") - property = insert( :property, - audience: audience_1 + programming_languages: ["C"], + topic_categories: ["Programming"] ) - insert( - :property, - audience: audience_2 - ) - assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 conn = conn |> Map.put(:remote_ip, {12, 109, 12, 14}) @@ -150,7 +156,10 @@ defmodule AdService.ServerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_1, + included_programming_languages: ["C"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Development"], included_countries: ["US"], us_hours_only: false ) @@ -164,7 +173,10 @@ defmodule AdService.ServerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_1, + included_programming_languages: ["C"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Development"], included_countries: ["US"], us_hours_only: true ) @@ -178,8 +190,12 @@ defmodule AdService.ServerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_2, - included_countries: ["US"] + included_programming_languages: ["Ruby"], + included_topic_categories: ["Development"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Programming"], + included_countries: ["US"], + us_hours_only: false ) advertisement = @@ -232,7 +248,9 @@ defmodule AdService.ServerTest do property = insert( :property, - audience: audience + audience: audience, + programming_languages: ["C"], + topic_categories: ["Programming"] ) assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 @@ -254,6 +272,10 @@ defmodule AdService.ServerTest do end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, audience: audience, + included_programming_languages: ["C"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) @@ -297,20 +319,15 @@ defmodule AdService.ServerTest do %{conn: conn, cdn_host: cdn_host} do creative = insert(:creative, small_image_asset: insert(:asset)) - audience_1 = insert(:audience, name: "right one") - audience_2 = insert(:audience, name: "wrong one") - property = insert( :property, - audience: audience_1 + %{ + programming_languages: ["C"], + topic_categories: ["Programming"] + } ) - insert( - :property, - audience: audience_2 - ) - assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 conn = conn |> Map.put(:remote_ip, {12, 109, 12, 14}) ip_string = conn.remote_ip |> Tuple.to_list() |> Enum.join(".") @@ -328,7 +345,10 @@ defmodule AdService.ServerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_1, + included_programming_languages: ["C"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) @@ -341,7 +361,10 @@ defmodule AdService.ServerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_2, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Development"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Programming"], included_countries: ["US"] ) @@ -441,12 +464,13 @@ defmodule AdService.ServerTest do %{conn: conn, cdn_host: cdn_host} do creative = insert(:creative, small_image_asset: insert(:asset)) - audience = insert(:audience) - property = insert( :property, - audience: audience + %{ + programming_languages: ["C"], + topic_categories: ["Programming"] + } ) assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 @@ -466,7 +490,10 @@ defmodule AdService.ServerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience, + included_programming_languages: ["C"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) @@ -569,7 +596,11 @@ defmodule AdService.ServerTest do insert(:campaign, creative: insert(:creative, small_image_asset: insert(:asset))) property = - insert(:property, audience: insert(:audience, fallback_campaign_id: fallback_campaign.id)) + insert(:property, + programming_languages: ["Ruby", "C"], + topic_categories: ["Programming"], + audience: insert(:audience, fallback_campaign_id: fallback_campaign.id) + ) assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 @@ -697,9 +728,10 @@ defmodule AdService.ServerTest do } end - test "returns an error if property is not assigned to an audience", %{ - conn: conn - } do + test "returns an error if property has no audience(for fallback) or programming languages or topic categories", + %{ + conn: conn + } do property = insert(:property) conn = conn |> Map.put(:remote_ip, {12, 109, 12, 14}) assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 @@ -712,7 +744,7 @@ defmodule AdService.ServerTest do assert impression.property_id == property.id assert impression.campaign_id == nil assert impression.country == "US" - assert impression.error_code == AdService.Impression.Errors.fetch_code(:property_inactive) + assert impression.error_code == AdService.Impression.Errors.fetch_code(:no_possible_ads) assert advertisement == %AdService.AdvertisementImpression{ headline: "", @@ -724,7 +756,7 @@ defmodule AdService.ServerTest do small_image_url: "", pixel: "//www.example.com/p/#{impression.id}/pixel.png", poweredByLink: "https://codefund.io?utm_content=", - reason: "This property is not currently active - code: 0" + reason: "CodeFund does not have an advertiser for you at this time - code: 2" } end diff --git a/test/code_fund_web/controllers/api/ad_serve_controller_test.exs b/test/code_fund_web/controllers/api/ad_serve_controller_test.exs index bd51137c7..acff1ee24 100644 --- a/test/code_fund_web/controllers/api/ad_serve_controller_test.exs +++ b/test/code_fund_web/controllers/api/ad_serve_controller_test.exs @@ -99,20 +99,15 @@ defmodule CodeFundWeb.API.AdServeControllerTest do %{conn: conn, cdn_host: cdn_host} do creative = insert(:creative, small_image_asset: insert(:asset)) - audience_1 = insert(:audience, name: "right one") - audience_2 = insert(:audience, name: "wrong one") - property = insert( :property, - audience: audience_1 + %{ + programming_languages: ["Ruby", "C"], + topic_categories: ["Programming"] + } ) - insert( - :property, - audience: audience_2 - ) - assert CodeFund.Impressions.list_impressions() |> Enum.count() == 0 conn = conn |> Map.put(:remote_ip, {12, 109, 12, 14}) ip_string = conn.remote_ip |> Tuple.to_list() |> Enum.join(".") @@ -130,7 +125,10 @@ defmodule CodeFundWeb.API.AdServeControllerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_1, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) @@ -143,7 +141,10 @@ defmodule CodeFundWeb.API.AdServeControllerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience_2, + included_programming_languages: ["Rust"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Ruby", "C"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) diff --git a/test/code_fund_web/controllers/api/v1/property/impression_controller_test.exs b/test/code_fund_web/controllers/api/v1/property/impression_controller_test.exs index c16f96be2..09aa5e4a8 100644 --- a/test/code_fund_web/controllers/api/v1/property/impression_controller_test.exs +++ b/test/code_fund_web/controllers/api/v1/property/impression_controller_test.exs @@ -6,12 +6,13 @@ defmodule CodeFundWeb.API.V1.Property.ImpressionControllerTest do {:ok, _pid} = TimeMachinex.ManagedClock.start() creative = insert(:creative, wide_image_asset: insert(:asset)) - audience = insert(:audience, name: "right one") - property = insert( :property, - audience: audience + %{ + programming_languages: ["Ruby", "C"], + topic_categories: ["Programming"] + } ) campaign = @@ -24,7 +25,10 @@ defmodule CodeFundWeb.API.V1.Property.ImpressionControllerTest do start_date: Timex.now() |> Timex.shift(days: -1) |> DateTime.to_naive(), end_date: Timex.now() |> Timex.shift(days: 1) |> DateTime.to_naive(), creative: creative, - audience: audience, + included_programming_languages: ["Ruby"], + included_topic_categories: ["Programming"], + excluded_programming_languages: ["Rust"], + excluded_topic_categories: ["Development"], included_countries: ["US"] ) diff --git a/test/code_fund_web/controllers/property_controller_test.exs b/test/code_fund_web/controllers/property_controller_test.exs index f267a621c..4307bfa06 100644 --- a/test/code_fund_web/controllers/property_controller_test.exs +++ b/test/code_fund_web/controllers/property_controller_test.exs @@ -3,6 +3,7 @@ defmodule CodeFundWeb.PropertyControllerTest do setup do users = stub_users() + {:ok, _pid} = TimeMachinex.ManagedClock.start() insert_pair(:user, company: "Foobar, Inc") insert(:user, company: "BarFoo")