github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/aggregator/date_test.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package aggregator
    13  
    14  import (
    15  	"testing"
    16  	"time"
    17  
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  const (
    22  	DateYearMonthDayHourMinute = "2022-06-16T17:30:"
    23  	DateNanoSecondsTimeZone    = ".451235Z"
    24  )
    25  
    26  func TestDateAggregator(t *testing.T) {
    27  	tests := []struct {
    28  		name           string
    29  		seconds        []string
    30  		expectedMedian string
    31  		expectedMode   string
    32  	}{
    33  		{
    34  			name:           "Single value",
    35  			seconds:        []string{"17"},
    36  			expectedMedian: "17",
    37  			expectedMode:   "17",
    38  		},
    39  		{
    40  			name:           "Even number of values",
    41  			seconds:        []string{"18", "18", "20", "25"},
    42  			expectedMedian: "19",
    43  			expectedMode:   "18",
    44  		},
    45  		{
    46  			name:           "Uneven number of values",
    47  			seconds:        []string{"18", "18", "19", "20", "25"},
    48  			expectedMedian: "19",
    49  			expectedMode:   "18",
    50  		},
    51  	}
    52  	names := []string{"AddTimestamp", "AddRow"}
    53  	for _, tt := range tests {
    54  		for _, name := range names { // test two ways of adding the value to the aggregator
    55  			t.Run(tt.name+" "+name, func(t *testing.T) {
    56  				agg := newDateAggregator()
    57  				for _, second := range tt.seconds {
    58  					fullDate := DateYearMonthDayHourMinute + second + DateNanoSecondsTimeZone
    59  					if name == names[0] {
    60  						err := agg.AddTimestamp(fullDate)
    61  						assert.Nil(t, err)
    62  					} else {
    63  						timeParsed, err := time.Parse(time.RFC3339, fullDate)
    64  						assert.Nil(t, err)
    65  						ts := newTimestamp(timeParsed.UnixNano())
    66  						err = agg.addRow(ts, 1)
    67  						assert.Nil(t, err)
    68  					}
    69  				}
    70  				agg.buildPairsFromCounts() // needed to populate all required info
    71  				assert.Equal(t, DateYearMonthDayHourMinute+tt.expectedMedian+DateNanoSecondsTimeZone, agg.Median())
    72  				if len(tt.expectedMode) > 0 { // if there is no value that appears more often than other values
    73  					assert.Equal(t, DateYearMonthDayHourMinute+tt.expectedMode+DateNanoSecondsTimeZone, agg.Mode())
    74  				}
    75  			})
    76  		}
    77  	}
    78  }