@@ -231,6 +231,147 @@ defmodule Lightning.UsageTracking.UserQueriesTest do
231231 end
232232 end
233233
234+ describe "monthly_active_users/1" do
235+ test "returns users that have logged in in the last 30 days" do
236+ user_within_window =
237+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
238+
239+ _active_token =
240+ insert (
241+ :user_token ,
242+ context: "session" ,
243+ inserted_at: ~U[ 2024-01-07 00:00:00Z] ,
244+ user: user_within_window
245+ )
246+
247+ user_on_report_date =
248+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
249+
250+ _active_token =
251+ insert (
252+ :user_token ,
253+ context: "session" ,
254+ inserted_at: ~U[ 2024-02-05 23:59:59Z] ,
255+ user: user_on_report_date
256+ )
257+
258+ user_older_than_30_days =
259+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
260+
261+ _ineligible_token_older_than_30_days =
262+ insert (
263+ :user_token ,
264+ context: "session" ,
265+ inserted_at: ~U[ 2024-01-06 23:59:59Z] ,
266+ user: user_older_than_30_days
267+ )
268+
269+ user_newer_than_report_date =
270+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
271+
272+ _ineligible_token_newer_than_report_date =
273+ insert (
274+ :user_token ,
275+ context: "session" ,
276+ inserted_at: ~U[ 2024-02-06 00:00:01Z] ,
277+ user: user_newer_than_report_date
278+ )
279+
280+ user_with_non_session_token =
281+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
282+
283+ _ineligible_token_not_session =
284+ insert (
285+ :user_token ,
286+ context: "api" ,
287+ inserted_at: ~U[ 2024-02-05 00:00:01Z] ,
288+ user: user_with_non_session_token
289+ )
290+
291+ result = UserQueries . monthly_active_users ( @ date ) |> Repo . all ( )
292+
293+ assert ( result |> contains ( user_within_window ) )
294+ assert ( result |> contains ( user_on_report_date ) )
295+ refute ( result |> contains ( user_older_than_30_days ) )
296+ refute ( result |> contains ( user_newer_than_report_date ) )
297+ refute ( result |> contains ( user_with_non_session_token ) )
298+ end
299+
300+ test "if user has more than one token, only includes user once" do
301+ user =
302+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
303+
304+ _active_token_1 =
305+ insert (
306+ :user_token ,
307+ context: "session" ,
308+ inserted_at: ~U[ 2024-01-07 00:00:00Z] ,
309+ user: user
310+ )
311+
312+ _active_token_2 =
313+ insert (
314+ :user_token ,
315+ context: "session" ,
316+ inserted_at: ~U[ 2024-01-07 00:00:01Z] ,
317+ user: user
318+ )
319+
320+ result = UserQueries . monthly_active_users ( @ date ) |> Repo . all ( )
321+
322+ assert ( result |> contains ( user ) )
323+ assert ( length ( result ) == 1 )
324+ end
325+ end
326+
327+ describe "monthly_active_users/2" do
328+ test "returns subset of user list that have logged in the last 30 days" do
329+ user_in_list_within_window =
330+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
331+
332+ _active_token =
333+ insert (
334+ :user_token ,
335+ context: "session" ,
336+ inserted_at: ~U[ 2024-01-07 00:00:00Z] ,
337+ user: user_in_list_within_window
338+ )
339+
340+ user_not_in_list =
341+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
342+
343+ _active_token =
344+ insert (
345+ :user_token ,
346+ context: "session" ,
347+ inserted_at: ~U[ 2024-01-07 00:00:00Z] ,
348+ user: user_not_in_list
349+ )
350+
351+ user_in_list_older_than_30_days =
352+ insert ( :user , inserted_at: ~U[ 2024-02-04 01:00:00Z] )
353+
354+ _ineligible_token_older_than_30_days =
355+ insert (
356+ :user_token ,
357+ context: "session" ,
358+ inserted_at: ~U[ 2024-01-06 23:59:59Z] ,
359+ user: user_in_list_older_than_30_days
360+ )
361+
362+ user_list = [
363+ user_in_list_within_window ,
364+ user_in_list_older_than_30_days
365+ ]
366+
367+ result = UserQueries . monthly_active_users ( @ date , user_list ) |> Repo . all ( )
368+
369+ assert ( result |> contains ( user_in_list_within_window ) )
370+ refute ( result |> contains ( user_not_in_list ) )
371+ refute ( result |> contains ( user_in_list_older_than_30_days ) )
372+ end
373+ end
374+
234375 defp contains ( result , desired_user ) do
235376 result |> Enum . find ( fn user -> user . id == desired_user . id end )
236377 end
0 commit comments