mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Fix age filtering regression (#778)
* Show filter control in loading/error * Add performer age unit tests * Fix addWhere regression
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -333,13 +333,26 @@ const RenderList = <
|
||||
/>
|
||||
);
|
||||
|
||||
let content;
|
||||
if (result.loading) {
|
||||
content = <LoadingIndicator />;
|
||||
} else if (result.error) {
|
||||
content = <h1>{result.error.message}</h1>;
|
||||
} else {
|
||||
content = (
|
||||
function maybeRenderContent() {
|
||||
if (result.loading || result.error) {
|
||||
return;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{renderPagination()}
|
||||
{renderContent(result, filter, selectedIds, zoomIndex)}
|
||||
<PaginationIndex
|
||||
itemsPerPage={filter.itemsPerPage}
|
||||
currentPage={filter.currentPage}
|
||||
totalItems={totalCount}
|
||||
/>
|
||||
{renderPagination()}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
const content = (
|
||||
<div>
|
||||
<ListFilter
|
||||
onFilterUpdate={updateQueryParams}
|
||||
@@ -365,17 +378,11 @@ const RenderList = <
|
||||
getSelectedData(getData(result), selectedIds),
|
||||
(deleted) => onDeleteDialogClosed(deleted)
|
||||
)}
|
||||
{renderPagination()}
|
||||
{renderContent(result, filter, selectedIds, zoomIndex)}
|
||||
<PaginationIndex
|
||||
itemsPerPage={filter.itemsPerPage}
|
||||
currentPage={filter.currentPage}
|
||||
totalItems={totalCount}
|
||||
/>
|
||||
{renderPagination()}
|
||||
{result.loading ? <LoadingIndicator /> : undefined}
|
||||
{result.error ? <h1>{result.error.message}</h1> : undefined}
|
||||
{maybeRenderContent()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return { contentTemplate: content, onSelectChange };
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user