package processor import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "apskel-pos-be/internal/constants" "apskel-pos-be/internal/entities" "apskel-pos-be/internal/models" "apskel-pos-be/internal/repository" ) // EG-903 against Postgres. Needs TEST_DATABASE_URL; see // internal/repository/wallet_repository_test.go. func TestEnakGameAnalytics_AgainstPostgres(t *testing.T) { e := newEnakGameEnv(t) ctx := e.ctx() analytics := NewEnakGameAnalyticsProcessor(repository.NewEnakGameAnalyticsRepository(e.db)) // Sessions and ledger rows are stamped with the test clock and the database's, // both now: a range around today holds them all. today := walletDay(e.now) q := models.EnakGameAnalyticsQuery{From: today.AddDate(0, 0, -1).Format("2006-01-02"), To: today.AddDate(0, 0, 1).Format("2006-01-02")} tap := e.gameWith("tap", entities.GameResultRules{}, constants.GameRewardTypeFixed, `{"amount": 10}`, 10) run := e.gameWith("run", entities.GameResultRules{}, constants.GameRewardTypeScoreBased, `{"bands": [{"min": 0, "max": 100, "amount": 5}, {"min": 101, "amount": 20}]}`, 20) e.coins(e.alice, 10, nil) e.coins(e.bob, 10, nil) for i, key := range []string{"tap-1", "tap-2"} { started, err := e.sessions.Start(ctx, e.alice, tap.ID, key) require.NoError(t, err, i) _, err = e.sessions.Complete(ctx, e.alice, started.SessionID, models.GameSessionCompleteInput{}) require.NoError(t, err, i) } _, err := e.sessions.Start(ctx, e.bob, tap.ID, "tap-3") // left open require.NoError(t, err) started, err := e.sessions.Start(ctx, e.alice, run.ID, "run-1") require.NoError(t, err) _, err = e.sessions.Complete(ctx, e.alice, started.SessionID, models.GameSessionCompleteInput{Score: ptr(int64(150))}) require.NoError(t, err) games, err := analytics.Games(ctx, e.orgA, q) require.NoError(t, err) assert.Equal(t, models.EnakGameStats{ Plays: 4, Completed: 3, Players: 2, AverageScore: ptr(150.0), AverageReward: 13.33, RewardPerPlay: 10, CoinIssued: 40, EntryCostPaid: 8, }, games.Totals) require.Len(t, games.Games, 2) assert.Equal(t, tap.ID, games.Games[0].GameID, "most played first") assert.EqualValues(t, 3, games.Games[0].Plays) assert.EqualValues(t, 2, games.Games[0].Players) assert.Nil(t, games.Games[0].AverageScore, "FIXED reports no score") assert.EqualValues(t, 20, games.Games[1].CoinIssued) one, err := analytics.Games(ctx, e.orgA, models.EnakGameAnalyticsQuery{From: q.From, To: q.To, GameID: run.ID.String()}) require.NoError(t, err) assert.EqualValues(t, 1, one.Totals.Plays) require.Len(t, one.Games, 1) other, err := analytics.Games(ctx, e.orgB, q) require.NoError(t, err) assert.Zero(t, other.Totals.Plays, "another organization's sessions never show") assert.Empty(t, other.Games) economy, err := analytics.Economy(ctx, e.orgA, q) require.NoError(t, err) assert.Equal(t, models.EnakGameCoinFlows{ Generated: 60, GameRewards: 40, SpentOnGames: 8, Spent: 8, Outstanding: 52, }, economy.Coin) assert.Zero(t, economy.Point) // A range before anything happened. empty, err := analytics.Economy(ctx, e.orgA, models.EnakGameAnalyticsQuery{From: "2020-01-01", To: "2020-01-31"}) require.NoError(t, err) assert.Zero(t, empty.Coin) assert.Empty(t, empty.ByType) }