From 16ea6abf91403aabed2c71dfac0454610470763b Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Mon, 31 Aug 2020 18:17:17 +1000 Subject: [PATCH] Fix age filtering regression (#778) * Show filter control in loading/error * Add performer age unit tests * Fix addWhere regression --- pkg/models/querybuilder_performer_test.go | 41 +++++++++++++ pkg/models/querybuilder_scene_test.go | 1 + pkg/models/querybuilder_sql.go | 2 +- pkg/models/setup_test.go | 12 ++++ ui/v2.5/src/hooks/ListHook.tsx | 73 +++++++++++++---------- 5 files changed, 95 insertions(+), 34 deletions(-) diff --git a/pkg/models/querybuilder_performer_test.go b/pkg/models/querybuilder_performer_test.go index 268780345..eb65b55bf 100644 --- a/pkg/models/querybuilder_performer_test.go +++ b/pkg/models/querybuilder_performer_test.go @@ -7,6 +7,7 @@ import ( "database/sql" "strings" "testing" + "time" "github.com/stretchr/testify/assert" @@ -207,6 +208,46 @@ func TestPerformerDestroyPerformerImage(t *testing.T) { assert.Nil(t, storedImage) } +func TestPerformerQueryAge(t *testing.T) { + const age = 19 + ageCriterion := models.IntCriterionInput{ + Value: age, + Modifier: models.CriterionModifierEquals, + } + + verifyPerformerAge(t, ageCriterion) + + ageCriterion.Modifier = models.CriterionModifierNotEquals + verifyPerformerAge(t, ageCriterion) + + ageCriterion.Modifier = models.CriterionModifierGreaterThan + verifyPerformerAge(t, ageCriterion) + + ageCriterion.Modifier = models.CriterionModifierLessThan + verifyPerformerAge(t, ageCriterion) +} + +func verifyPerformerAge(t *testing.T, ageCriterion models.IntCriterionInput) { + qb := models.NewPerformerQueryBuilder() + performerFilter := models.PerformerFilterType{ + Age: &ageCriterion, + } + + performers, _ := qb.Query(&performerFilter, nil) + + now := time.Now() + for _, performer := range performers { + bd := performer.Birthdate.String + d, _ := time.Parse("2006-01-02", bd) + age := now.Year() - d.Year() + if now.YearDay() < d.YearDay() { + age = age - 1 + } + + verifyInt(t, age, ageCriterion) + } +} + // TODO Update // TODO Destroy // TODO Find diff --git a/pkg/models/querybuilder_scene_test.go b/pkg/models/querybuilder_scene_test.go index 578f981af..c86e7c3e6 100644 --- a/pkg/models/querybuilder_scene_test.go +++ b/pkg/models/querybuilder_scene_test.go @@ -229,6 +229,7 @@ func verifyScenesOCounter(t *testing.T, oCounterCriterion models.IntCriterionInp } func verifyInt(t *testing.T, value int, criterion models.IntCriterionInput) { + t.Helper() assert := assert.New(t) if criterion.Modifier == models.CriterionModifierEquals { assert.Equal(criterion.Value, value) diff --git a/pkg/models/querybuilder_sql.go b/pkg/models/querybuilder_sql.go index 0498667fc..300884491 100644 --- a/pkg/models/querybuilder_sql.go +++ b/pkg/models/querybuilder_sql.go @@ -31,7 +31,7 @@ func (qb queryBuilder) executeFind() ([]int, int) { func (qb *queryBuilder) addWhere(clauses ...string) { for _, clause := range clauses { if len(clause) > 0 { - qb.whereClauses = append(qb.whereClauses, clauses...) + qb.whereClauses = append(qb.whereClauses, clause) } } } diff --git a/pkg/models/setup_test.go b/pkg/models/setup_test.go index a06924b5c..36c53905d 100644 --- a/pkg/models/setup_test.go +++ b/pkg/models/setup_test.go @@ -11,6 +11,7 @@ import ( "os" "strconv" "testing" + "time" "github.com/jmoiron/sqlx" @@ -370,6 +371,13 @@ func getPerformerBoolValue(index int) bool { return index == 1 } +func getPerformerBirthdate(index int) string { + const minAge = 18 + birthdate := time.Now() + birthdate = birthdate.AddDate(-minAge-index, -1, -1) + return birthdate.Format("2006-01-02") +} + //createPerformers creates n performers with plain Name and o performers with camel cased NaMe included func createPerformers(tx *sqlx.Tx, n int, o int) error { pqb := models.NewPerformerQueryBuilder() @@ -391,6 +399,10 @@ func createPerformers(tx *sqlx.Tx, n int, o int) error { Name: sql.NullString{String: getPerformerStringValue(index, name), Valid: true}, Checksum: getPerformerStringValue(i, checksumField), Favorite: sql.NullBool{Bool: getPerformerBoolValue(i), Valid: true}, + Birthdate: models.SQLiteDate{ + String: getPerformerBirthdate(i), + Valid: true, + }, } created, err := pqb.Create(performer, tx) diff --git a/ui/v2.5/src/hooks/ListHook.tsx b/ui/v2.5/src/hooks/ListHook.tsx index 2e7a63ad7..b6bfaf037 100644 --- a/ui/v2.5/src/hooks/ListHook.tsx +++ b/ui/v2.5/src/hooks/ListHook.tsx @@ -333,38 +333,13 @@ const RenderList = < /> ); - let content; - if (result.loading) { - content = ; - } else if (result.error) { - content =

{result.error.message}

; - } else { - content = ( -
- 0} - onEdit={renderEditDialog ? onEdit : undefined} - onDelete={renderDeleteDialog ? onDelete : undefined} - filter={filter} - /> - {isEditDialogOpen && - renderEditDialog && - renderEditDialog( - getSelectedData(getData(result), selectedIds), - (applied) => onEditDialogClosed(applied) - )} - {isDeleteDialogOpen && - renderDeleteDialog && - renderDeleteDialog( - getSelectedData(getData(result), selectedIds), - (deleted) => onDeleteDialogClosed(deleted) - )} + function maybeRenderContent() { + if (result.loading || result.error) { + return; + } + + return ( + <> {renderPagination()} {renderContent(result, filter, selectedIds, zoomIndex)} {renderPagination()} -
+ ); } + const content = ( +
+ 0} + onEdit={renderEditDialog ? onEdit : undefined} + onDelete={renderDeleteDialog ? onDelete : undefined} + filter={filter} + /> + {isEditDialogOpen && + renderEditDialog && + renderEditDialog( + getSelectedData(getData(result), selectedIds), + (applied) => onEditDialogClosed(applied) + )} + {isDeleteDialogOpen && + renderDeleteDialog && + renderDeleteDialog( + getSelectedData(getData(result), selectedIds), + (deleted) => onDeleteDialogClosed(deleted) + )} + {result.loading ? : undefined} + {result.error ?

{result.error.message}

: undefined} + {maybeRenderContent()} +
+ ); + return { contentTemplate: content, onSelectChange }; };