1+ import { getAreaModel , createIndexes } from "../../db"
2+ import inMemoryDB from "../../utils/inMemoryDB"
3+ import MutableAreaDataSource from "../MutableAreaDataSource"
4+ import muid , { MUUID } from 'uuid-mongodb'
5+ import { AreaType } from "../../db/AreaTypes"
6+ import AreaDataSource from "../AreaDataSource"
7+ import MutableMediaDataSource from "../MutableMediaDataSource"
8+ import { MediaObjectGQLInput } from "../../db/MediaObjectTypes"
9+ import MutableClimbDataSource from "../MutableClimbDataSource"
10+ import muuid from 'uuid-mongodb'
11+
12+
13+ function mediaInput ( val : number ) {
14+ return {
15+ userUuid : 'a2eb6353-65d1-445f-912c-53c6301404bd' ,
16+ mediaUrl : `/u/a2eb6353-65d1-445f-912c-53c6301404bd/photo${ val } .jpg` ,
17+ width : 800 ,
18+ height : 600 ,
19+ format : 'jpeg' ,
20+ size : 45000 + Math . floor ( Math . random ( ) * 100 )
21+ } satisfies MediaObjectGQLInput }
22+
23+ describe ( "Test area data source" , ( ) => {
24+ let areas : AreaDataSource
25+ let rootCountry : AreaType
26+ let areaCounter = 0
27+ const testUser = muid . v4 ( )
28+
29+ async function addArea ( name ?: string , extra ?: Partial < { leaf : boolean , boulder : boolean , parent : MUUID | AreaType } > ) {
30+ function isArea ( x : any ) : x is AreaType {
31+ return typeof x . metadata ?. area_id !== 'undefined'
32+ }
33+
34+ areaCounter += 1
35+ if ( name === undefined || name === 'test' ) {
36+ name = process . uptime ( ) . toString ( ) + '-' + areaCounter . toString ( )
37+ }
38+
39+ let parent : MUUID | undefined = undefined
40+ if ( extra ?. parent ) {
41+ if ( isArea ( extra . parent ) ) {
42+ parent = extra . parent . metadata ?. area_id
43+ } else {
44+ parent = extra . parent
45+ }
46+ }
47+
48+ return MutableAreaDataSource . getInstance ( ) . addArea (
49+ testUser ,
50+ name ,
51+ parent ?? rootCountry . metadata . area_id ,
52+ undefined ,
53+ undefined ,
54+ extra ?. leaf ,
55+ extra ?. boulder
56+ )
57+ }
58+
59+ beforeAll ( async ( ) => {
60+ await inMemoryDB . connect ( )
61+ await getAreaModel ( ) . collection . drop ( )
62+ await createIndexes ( )
63+ areas = MutableAreaDataSource . getInstance ( )
64+ // We need a root country, and it is beyond the scope of these tests
65+ rootCountry = await MutableAreaDataSource . getInstance ( ) . addCountry ( "USA" )
66+ } )
67+
68+ afterAll ( inMemoryDB . close )
69+
70+ describe ( "Image size summing" , ( ) => {
71+ test ( "Area image size summing should not produce false counts" , async ( ) => {
72+ const area = await addArea ( )
73+ const val = await areas . computeImageByteSum ( area . metadata . area_id )
74+ expect ( val ) . toBe ( 0 )
75+ } )
76+
77+ test ( "Area image size summing should work for direct tags" , async ( ) => {
78+ const area = await addArea ( )
79+ const media = MutableMediaDataSource . getInstance ( )
80+ const [ object ] = await media . addMediaObjects ( [ mediaInput ( 0 ) ] )
81+ media . upsertEntityTag ( { entityType : 1 , entityUuid : area . metadata . area_id , mediaId : object . _id } )
82+ const val = await areas . computeImageByteSum ( area . metadata . area_id )
83+ expect ( val ) . toBe ( object . size )
84+ } )
85+
86+ test ( "Area image size summing should work for direct tags to children" , async ( ) => {
87+ const media = MutableMediaDataSource . getInstance ( )
88+ const area = await addArea ( )
89+ let child = area
90+ let sizeAccumulator = 0
91+ for ( const idx of Array . from ( { length : 10 } ) . map ( ( _ , idx ) => idx ) ) {
92+ child = await addArea ( undefined , { parent : child . metadata . area_id } )
93+ const [ object ] = await media . addMediaObjects ( [ mediaInput ( ( idx + 1 ) * 10 ) ] )
94+ media . upsertEntityTag ( { entityType : 1 , entityUuid : child . metadata . area_id , mediaId : object . _id } )
95+
96+ // We always query the top level
97+ expect ( await areas . computeImageByteSum ( area . metadata . area_id ) . then ( d => {
98+ sizeAccumulator += d
99+ return sizeAccumulator
100+ } ) ) . toBe ( sizeAccumulator )
101+ // equally, we expect the child to not get reverse-polluted
102+ expect ( await areas . computeImageByteSum ( child . metadata . area_id ) ) . toBe ( object . size )
103+ }
104+ } )
105+
106+ test ( "Area image size summing should work for direct tags to climbs" , async ( ) => {
107+ const area = await addArea ( )
108+ const media = MutableMediaDataSource . getInstance ( )
109+ const climbs = MutableClimbDataSource . getInstance ( )
110+ const child = await addArea ( undefined , { parent : area . metadata . area_id } )
111+ expect ( await areas . computeImageByteSum ( area . metadata . area_id ) ) . toBe ( 0 )
112+ expect ( await areas . computeImageByteSum ( child . metadata . area_id ) ) . toBe ( 0 )
113+
114+ const [ object ] = await media . addMediaObjects ( [ mediaInput ( 2 * 100 ) ] )
115+ const [ climb ] = await climbs . addOrUpdateClimbs ( object . userUuid , child . metadata . area_id , [ {
116+ name : "climb" ,
117+ grade : "6c+"
118+ } ] )
119+
120+ media . upsertEntityTag ( { entityType : 0 , entityUuid : muuid . from ( climb ) , mediaId : object . _id } )
121+ expect ( await areas . computeImageByteSum ( area . metadata . area_id ) ) . toBe ( object . size )
122+ } )
123+ } )
124+ } )
0 commit comments