2020-01-16 21:56:24 +01:00
package persistence
import (
2020-01-28 14:22:17 +01:00
"context"
2020-02-09 04:55:05 +01:00
"time"
2020-01-18 07:56:17 +01:00
2021-07-16 17:03:28 +02:00
"github.com/Masterminds/squirrel"
2022-07-30 18:43:48 +02:00
"github.com/beego/beego/v2/client/orm"
2020-01-28 14:22:17 +01:00
"github.com/google/uuid"
2020-01-31 15:53:19 +01:00
"github.com/navidrome/navidrome/log"
2020-01-24 01:44:08 +01:00
"github.com/navidrome/navidrome/model"
2020-05-13 22:49:55 +02:00
"github.com/navidrome/navidrome/model/request"
2022-07-26 22:47:16 +02:00
. "github.com/onsi/ginkgo/v2"
2020-01-16 21:56:24 +01:00
. "github.com/onsi/gomega"
)
2020-01-28 14:22:17 +01:00
var _ = Describe ( "MediaRepository" , func ( ) {
var mr model . MediaFileRepository
2020-01-16 21:56:24 +01:00
BeforeEach ( func ( ) {
2020-05-13 22:49:55 +02:00
ctx := log . NewContext ( context . TODO ( ) )
ctx = request . WithUser ( ctx , model . User { ID : "userid" } )
2020-01-28 14:22:17 +01:00
mr = NewMediaFileRepository ( ctx , orm . NewOrm ( ) )
2020-01-16 21:56:24 +01:00
} )
2020-01-28 14:22:17 +01:00
It ( "gets mediafile from the DB" , func ( ) {
2020-04-20 04:40:24 +02:00
Expect ( mr . Get ( "1004" ) ) . To ( Equal ( & songAntenna ) )
2020-01-16 21:56:24 +01:00
} )
2020-01-28 14:22:17 +01:00
It ( "returns ErrNotFound" , func ( ) {
_ , err := mr . Get ( "56" )
Expect ( err ) . To ( MatchError ( model . ErrNotFound ) )
} )
It ( "counts the number of mediafiles in the DB" , func ( ) {
Expect ( mr . CountAll ( ) ) . To ( Equal ( int64 ( 4 ) ) )
} )
It ( "checks existence of mediafiles in the DB" , func ( ) {
Expect ( mr . Exists ( songAntenna . ID ) ) . To ( BeTrue ( ) )
Expect ( mr . Exists ( "666" ) ) . To ( BeFalse ( ) )
} )
2020-07-14 21:27:27 +02:00
It ( "finds tracks by path when using wildcards chars" , func ( ) {
2020-07-14 00:37:48 +02:00
Expect ( mr . Put ( & model . MediaFile { ID : "7001" , Path : P ( "/Find:By'Path/_/123.mp3" ) } ) ) . To ( BeNil ( ) )
Expect ( mr . Put ( & model . MediaFile { ID : "7002" , Path : P ( "/Find:By'Path/1/123.mp3" ) } ) ) . To ( BeNil ( ) )
2020-07-11 20:38:17 +02:00
found , err := mr . FindAllByPath ( P ( "/Find:By'Path/_/" ) )
2020-07-14 00:37:48 +02:00
Expect ( err ) . To ( BeNil ( ) )
Expect ( found ) . To ( HaveLen ( 1 ) )
Expect ( found [ 0 ] . ID ) . To ( Equal ( "7001" ) )
2020-01-28 14:22:17 +01:00
} )
2020-07-22 17:18:50 +02:00
It ( "finds tracks by path when using UTF8 chars" , func ( ) {
Expect ( mr . Put ( & model . MediaFile { ID : "7010" , Path : P ( "/Пётр Ильич Чайковский/123.mp3" ) } ) ) . To ( BeNil ( ) )
Expect ( mr . Put ( & model . MediaFile { ID : "7011" , Path : P ( "/Пётр Ильич Чайковский/222.mp3" ) } ) ) . To ( BeNil ( ) )
found , err := mr . FindAllByPath ( P ( "/Пётр Ильич Чайковский/" ) )
Expect ( err ) . To ( BeNil ( ) )
Expect ( found ) . To ( HaveLen ( 2 ) )
} )
2020-07-14 21:27:27 +02:00
It ( "finds tracks by path case sensitively" , func ( ) {
Expect ( mr . Put ( & model . MediaFile { ID : "7003" , Path : P ( "/Casesensitive/file1.mp3" ) } ) ) . To ( BeNil ( ) )
Expect ( mr . Put ( & model . MediaFile { ID : "7004" , Path : P ( "/casesensitive/file2.mp3" ) } ) ) . To ( BeNil ( ) )
2020-07-11 20:38:17 +02:00
found , err := mr . FindAllByPath ( P ( "/Casesensitive" ) )
2020-07-14 21:27:27 +02:00
Expect ( err ) . To ( BeNil ( ) )
Expect ( found ) . To ( HaveLen ( 1 ) )
Expect ( found [ 0 ] . ID ) . To ( Equal ( "7003" ) )
2020-07-11 20:38:17 +02:00
found , err = mr . FindAllByPath ( P ( "/casesensitive/" ) )
2020-07-14 21:27:27 +02:00
Expect ( err ) . To ( BeNil ( ) )
Expect ( found ) . To ( HaveLen ( 1 ) )
Expect ( found [ 0 ] . ID ) . To ( Equal ( "7004" ) )
} )
2020-01-28 14:22:17 +01:00
It ( "delete tracks by id" , func ( ) {
2021-02-01 07:22:31 +01:00
id := uuid . NewString ( )
2020-01-28 14:22:17 +01:00
Expect ( mr . Put ( & model . MediaFile { ID : id } ) ) . To ( BeNil ( ) )
Expect ( mr . Delete ( id ) ) . To ( BeNil ( ) )
_ , err := mr . Get ( id )
Expect ( err ) . To ( MatchError ( model . ErrNotFound ) )
} )
It ( "delete tracks by path" , func ( ) {
2020-07-22 17:18:50 +02:00
id1 := "6001"
2020-01-28 14:22:17 +01:00
Expect ( mr . Put ( & model . MediaFile { ID : id1 , Path : P ( "/abc/123/" + id1 + ".mp3" ) } ) ) . To ( BeNil ( ) )
2020-07-22 17:18:50 +02:00
id2 := "6002"
2020-01-28 14:22:17 +01:00
Expect ( mr . Put ( & model . MediaFile { ID : id2 , Path : P ( "/abc/123/" + id2 + ".mp3" ) } ) ) . To ( BeNil ( ) )
2020-07-22 17:18:50 +02:00
id3 := "6003"
2020-07-14 00:37:48 +02:00
Expect ( mr . Put ( & model . MediaFile { ID : id3 , Path : P ( "/ab_/" + id3 + ".mp3" ) } ) ) . To ( BeNil ( ) )
2020-07-22 17:18:50 +02:00
id4 := "6004"
2020-07-14 00:37:48 +02:00
Expect ( mr . Put ( & model . MediaFile { ID : id4 , Path : P ( "/abc/" + id4 + ".mp3" ) } ) ) . To ( BeNil ( ) )
2020-07-22 17:18:50 +02:00
id5 := "6005"
2020-07-14 21:35:42 +02:00
Expect ( mr . Put ( & model . MediaFile { ID : id5 , Path : P ( "/Ab_/" + id5 + ".mp3" ) } ) ) . To ( BeNil ( ) )
2020-01-28 14:22:17 +01:00
2020-07-14 00:37:48 +02:00
Expect ( mr . DeleteByPath ( P ( "/ab_" ) ) ) . To ( Equal ( int64 ( 1 ) ) )
2020-01-28 14:22:17 +01:00
2020-01-31 23:56:02 +01:00
Expect ( mr . Get ( id1 ) ) . ToNot ( BeNil ( ) )
Expect ( mr . Get ( id2 ) ) . ToNot ( BeNil ( ) )
2020-07-14 00:37:48 +02:00
Expect ( mr . Get ( id4 ) ) . ToNot ( BeNil ( ) )
2020-07-14 21:35:42 +02:00
Expect ( mr . Get ( id5 ) ) . ToNot ( BeNil ( ) )
2020-01-31 23:56:02 +01:00
_ , err := mr . Get ( id3 )
2020-01-28 14:22:17 +01:00
Expect ( err ) . To ( MatchError ( model . ErrNotFound ) )
} )
2020-02-09 04:55:05 +01:00
2020-07-22 17:18:50 +02:00
It ( "delete tracks by path containing UTF8 chars" , func ( ) {
id1 := "6011"
Expect ( mr . Put ( & model . MediaFile { ID : id1 , Path : P ( "/Legião Urbana/" + id1 + ".mp3" ) } ) ) . To ( BeNil ( ) )
id2 := "6012"
Expect ( mr . Put ( & model . MediaFile { ID : id2 , Path : P ( "/Legião Urbana/" + id2 + ".mp3" ) } ) ) . To ( BeNil ( ) )
id3 := "6003"
Expect ( mr . Put ( & model . MediaFile { ID : id3 , Path : P ( "/Legião Urbana/" + id3 + ".mp3" ) } ) ) . To ( BeNil ( ) )
Expect ( mr . FindAllByPath ( P ( "/Legião Urbana" ) ) ) . To ( HaveLen ( 3 ) )
Expect ( mr . DeleteByPath ( P ( "/Legião Urbana" ) ) ) . To ( Equal ( int64 ( 3 ) ) )
Expect ( mr . FindAllByPath ( P ( "/Legião Urbana" ) ) ) . To ( HaveLen ( 0 ) )
} )
2020-10-05 17:52:09 +02:00
It ( "only deletes tracks that match exact path" , func ( ) {
id1 := "6021"
Expect ( mr . Put ( & model . MediaFile { ID : id1 , Path : P ( "/music/overlap/Ella Fitzgerald/" + id1 + ".mp3" ) } ) ) . To ( BeNil ( ) )
id2 := "6022"
Expect ( mr . Put ( & model . MediaFile { ID : id2 , Path : P ( "/music/overlap/Ella Fitzgerald/" + id2 + ".mp3" ) } ) ) . To ( BeNil ( ) )
id3 := "6023"
Expect ( mr . Put ( & model . MediaFile { ID : id3 , Path : P ( "/music/overlap/Ella Fitzgerald & Louis Armstrong - They Can't Take That Away From Me.mp3" ) } ) ) . To ( BeNil ( ) )
Expect ( mr . FindAllByPath ( P ( "/music/overlap/Ella Fitzgerald" ) ) ) . To ( HaveLen ( 2 ) )
Expect ( mr . DeleteByPath ( P ( "/music/overlap/Ella Fitzgerald" ) ) ) . To ( Equal ( int64 ( 2 ) ) )
Expect ( mr . FindAllByPath ( P ( "/music/overlap" ) ) ) . To ( HaveLen ( 1 ) )
} )
2021-07-16 17:03:28 +02:00
It ( "filters by genre" , func ( ) {
Expect ( mr . GetAll ( model . QueryOptions {
Sort : "genre.name asc, title asc" ,
Filters : squirrel . Eq { "genre.name" : "Rock" } ,
} ) ) . To ( Equal ( model . MediaFiles {
songDayInALife ,
songAntenna ,
songComeTogether ,
} ) )
} )
2020-02-09 04:55:05 +01:00
Context ( "Annotations" , func ( ) {
It ( "increments play count when the tracks does not have annotations" , func ( ) {
id := "incplay.firsttime"
Expect ( mr . Put ( & model . MediaFile { ID : id } ) ) . To ( BeNil ( ) )
playDate := time . Now ( )
Expect ( mr . IncPlayCount ( id , playDate ) ) . To ( BeNil ( ) )
mf , err := mr . Get ( id )
Expect ( err ) . To ( BeNil ( ) )
Expect ( mf . PlayDate . Unix ( ) ) . To ( Equal ( playDate . Unix ( ) ) )
2020-05-20 05:50:27 +02:00
Expect ( mf . PlayCount ) . To ( Equal ( int64 ( 1 ) ) )
2020-02-09 04:55:05 +01:00
} )
It ( "increments play count on newly starred items" , func ( ) {
id := "star.incplay"
Expect ( mr . Put ( & model . MediaFile { ID : id } ) ) . To ( BeNil ( ) )
Expect ( mr . SetStar ( true , id ) ) . To ( BeNil ( ) )
playDate := time . Now ( )
Expect ( mr . IncPlayCount ( id , playDate ) ) . To ( BeNil ( ) )
mf , err := mr . Get ( id )
Expect ( err ) . To ( BeNil ( ) )
Expect ( mf . PlayDate . Unix ( ) ) . To ( Equal ( playDate . Unix ( ) ) )
2020-05-20 05:50:27 +02:00
Expect ( mf . PlayCount ) . To ( Equal ( int64 ( 1 ) ) )
2020-02-09 04:55:05 +01:00
} )
} )
2020-01-16 21:56:24 +01:00
} )