2021-10-22 00:03:46 +02:00
package criteria
import (
"encoding/json"
"fmt"
"time"
2022-07-26 22:47:16 +02:00
. "github.com/onsi/ginkgo/v2"
2021-10-22 00:03:46 +02:00
"github.com/onsi/gomega"
)
var _ = Describe ( "Operators" , func ( ) {
2022-10-03 18:25:04 +02:00
rangeStart := date ( time . Date ( 2021 , 10 , 01 , 0 , 0 , 0 , 0 , time . Local ) )
rangeEnd := date ( time . Date ( 2021 , 11 , 01 , 0 , 0 , 0 , 0 , time . Local ) )
2021-10-22 00:03:46 +02:00
DescribeTable ( "ToSQL" ,
2022-10-01 01:55:44 +02:00
func ( op Expression , expectedSql string , expectedArgs ... any ) {
2021-10-22 00:03:46 +02:00
sql , args , err := op . ToSql ( )
gomega . Expect ( err ) . ToNot ( gomega . HaveOccurred ( ) )
gomega . Expect ( sql ) . To ( gomega . Equal ( expectedSql ) )
2024-06-06 01:42:46 +02:00
gomega . Expect ( args ) . To ( gomega . HaveExactElements ( expectedArgs ... ) )
2021-10-22 00:03:46 +02:00
} ,
Entry ( "is [string]" , Is { "title" : "Low Rider" } , "media_file.title = ?" , "Low Rider" ) ,
2022-07-28 02:43:24 +02:00
Entry ( "is [bool]" , Is { "loved" : true } , "COALESCE(annotation.starred, false) = ?" , true ) ,
2021-10-22 00:03:46 +02:00
Entry ( "isNot" , IsNot { "title" : "Low Rider" } , "media_file.title <> ?" , "Low Rider" ) ,
2021-11-20 00:22:33 +01:00
Entry ( "gt" , Gt { "playCount" : 10 } , "COALESCE(annotation.play_count, 0) > ?" , 10 ) ,
Entry ( "lt" , Lt { "playCount" : 10 } , "COALESCE(annotation.play_count, 0) < ?" , 10 ) ,
2021-10-25 22:17:03 +02:00
Entry ( "contains" , Contains { "title" : "Low Rider" } , "media_file.title LIKE ?" , "%Low Rider%" ) ,
Entry ( "notContains" , NotContains { "title" : "Low Rider" } , "media_file.title NOT LIKE ?" , "%Low Rider%" ) ,
Entry ( "startsWith" , StartsWith { "title" : "Low Rider" } , "media_file.title LIKE ?" , "Low Rider%" ) ,
Entry ( "endsWith" , EndsWith { "title" : "Low Rider" } , "media_file.title LIKE ?" , "%Low Rider" ) ,
2021-10-22 00:03:46 +02:00
Entry ( "inTheRange [number]" , InTheRange { "year" : [ ] int { 1980 , 1990 } } , "(media_file.year >= ? AND media_file.year <= ?)" , 1980 , 1990 ) ,
2022-10-03 18:25:04 +02:00
Entry ( "inTheRange [date]" , InTheRange { "lastPlayed" : [ ] date { rangeStart , rangeEnd } } , "(annotation.play_date >= ? AND annotation.play_date <= ?)" , rangeStart , rangeEnd ) ,
2021-10-22 00:03:46 +02:00
Entry ( "before" , Before { "lastPlayed" : rangeStart } , "annotation.play_date < ?" , rangeStart ) ,
Entry ( "after" , After { "lastPlayed" : rangeStart } , "annotation.play_date > ?" , rangeStart ) ,
// TODO These may be flaky
Entry ( "inTheLast" , InTheLast { "lastPlayed" : 30 } , "annotation.play_date > ?" , startOfPeriod ( 30 , time . Now ( ) ) ) ,
2021-10-22 04:15:05 +02:00
Entry ( "notInTheLast" , NotInTheLast { "lastPlayed" : 30 } , "(annotation.play_date < ? OR annotation.play_date IS NULL)" , startOfPeriod ( 30 , time . Now ( ) ) ) ,
2024-01-21 00:22:17 +01:00
Entry ( "inPlaylist" , InPlaylist { "id" : "deadbeef-dead-beef" } , "media_file.id IN " +
"(SELECT media_file_id FROM playlist_tracks pl LEFT JOIN playlist on pl.playlist_id = playlist.id WHERE (pl.playlist_id = ? AND playlist.public = ?))" , "deadbeef-dead-beef" , 1 ) ,
Entry ( "notInPlaylist" , NotInPlaylist { "id" : "deadbeef-dead-beef" } , "media_file.id NOT IN " +
"(SELECT media_file_id FROM playlist_tracks pl LEFT JOIN playlist on pl.playlist_id = playlist.id WHERE (pl.playlist_id = ? AND playlist.public = ?))" , "deadbeef-dead-beef" , 1 ) ,
2021-10-22 00:03:46 +02:00
)
2022-10-03 18:25:04 +02:00
DescribeTable ( "JSON Marshaling" ,
2021-10-22 00:03:46 +02:00
func ( op Expression , jsonString string ) {
obj := And { op }
newJs , err := json . Marshal ( obj )
gomega . Expect ( err ) . ToNot ( gomega . HaveOccurred ( ) )
gomega . Expect ( string ( newJs ) ) . To ( gomega . Equal ( fmt . Sprintf ( ` { "all":[%s]} ` , jsonString ) ) )
var unmarshalObj unmarshalConjunctionType
js := "[" + jsonString + "]"
err = json . Unmarshal ( [ ] byte ( js ) , & unmarshalObj )
gomega . Expect ( err ) . ToNot ( gomega . HaveOccurred ( ) )
gomega . Expect ( unmarshalObj [ 0 ] ) . To ( gomega . Equal ( op ) )
} ,
Entry ( "is [string]" , Is { "title" : "Low Rider" } , ` { "is": { "title":"Low Rider"}} ` ) ,
Entry ( "is [bool]" , Is { "loved" : false } , ` { "is": { "loved":false}} ` ) ,
Entry ( "isNot" , IsNot { "title" : "Low Rider" } , ` { "isNot": { "title":"Low Rider"}} ` ) ,
Entry ( "gt" , Gt { "playCount" : 10.0 } , ` { "gt": { "playCount":10}} ` ) ,
Entry ( "lt" , Lt { "playCount" : 10.0 } , ` { "lt": { "playCount":10}} ` ) ,
Entry ( "contains" , Contains { "title" : "Low Rider" } , ` { "contains": { "title":"Low Rider"}} ` ) ,
Entry ( "notContains" , NotContains { "title" : "Low Rider" } , ` { "notContains": { "title":"Low Rider"}} ` ) ,
Entry ( "startsWith" , StartsWith { "title" : "Low Rider" } , ` { "startsWith": { "title":"Low Rider"}} ` ) ,
Entry ( "endsWith" , EndsWith { "title" : "Low Rider" } , ` { "endsWith": { "title":"Low Rider"}} ` ) ,
Entry ( "inTheRange [number]" , InTheRange { "year" : [ ] interface { } { 1980.0 , 1990.0 } } , ` { "inTheRange": { "year":[1980,1990]}} ` ) ,
Entry ( "inTheRange [date]" , InTheRange { "lastPlayed" : [ ] interface { } { "2021-10-01" , "2021-11-01" } } , ` { "inTheRange": { "lastPlayed":["2021-10-01","2021-11-01"]}} ` ) ,
Entry ( "before" , Before { "lastPlayed" : "2021-10-01" } , ` { "before": { "lastPlayed":"2021-10-01"}} ` ) ,
Entry ( "after" , After { "lastPlayed" : "2021-10-01" } , ` { "after": { "lastPlayed":"2021-10-01"}} ` ) ,
Entry ( "inTheLast" , InTheLast { "lastPlayed" : 30.0 } , ` { "inTheLast": { "lastPlayed":30}} ` ) ,
Entry ( "notInTheLast" , NotInTheLast { "lastPlayed" : 30.0 } , ` { "notInTheLast": { "lastPlayed":30}} ` ) ,
2024-01-21 00:22:17 +01:00
Entry ( "inPlaylist" , InPlaylist { "id" : "deadbeef-dead-beef" } , ` { "inPlaylist": { "id":"deadbeef-dead-beef"}} ` ) ,
Entry ( "notInPlaylist" , NotInPlaylist { "id" : "deadbeef-dead-beef" } , ` { "notInPlaylist": { "id":"deadbeef-dead-beef"}} ` ) ,
2021-10-22 00:03:46 +02:00
)
} )