| 
									
										
										
										
											2022-12-09 16:13:22 +01:00
										 |  |  | const {note} = require('./becca_mocking'); | 
					
						
							| 
									
										
										
										
											2022-01-10 17:09:20 +01:00
										 |  |  | const ValueExtractor = require('../../src/services/search/value_extractor'); | 
					
						
							|  |  |  | const becca = require('../../src/becca/becca'); | 
					
						
							|  |  |  | const SearchContext = require("../../src/services/search/search_context"); | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | const dsc = new SearchContext(); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe("Value extractor", () => { | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2021-04-16 23:00:08 +02:00
										 |  |  |         becca.reset(); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("simple title extraction", async () => { | 
					
						
							|  |  |  |         const europe = note("Europe").note; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         const valueExtractor = new ValueExtractor(dsc, ["note", "title"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							|  |  |  |         expect(valueExtractor.extract(europe)).toEqual("Europe"); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("label extraction", async () => { | 
					
						
							|  |  |  |         const austria = note("Austria") | 
					
						
							|  |  |  |             .label("Capital", "Vienna") | 
					
						
							|  |  |  |             .note; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         let valueExtractor = new ValueExtractor(dsc, ["note", "labels", "capital"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							| 
									
										
										
										
											2020-12-15 15:09:00 +01:00
										 |  |  |         expect(valueExtractor.extract(austria)).toEqual("Vienna"); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         valueExtractor = new ValueExtractor(dsc, ["#capital"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							| 
									
										
										
										
											2020-12-15 15:09:00 +01:00
										 |  |  |         expect(valueExtractor.extract(austria)).toEqual("Vienna"); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("parent/child property extraction", async () => { | 
					
						
							|  |  |  |         const vienna = note("Vienna"); | 
					
						
							|  |  |  |         const europe = note("Europe") | 
					
						
							|  |  |  |             .child(note("Austria") | 
					
						
							|  |  |  |                 .child(vienna)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         let valueExtractor = new ValueExtractor(dsc, ["note", "children", "children", "title"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							|  |  |  |         expect(valueExtractor.extract(europe.note)).toEqual("Vienna"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         valueExtractor = new ValueExtractor(dsc, ["note", "parents", "parents", "title"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							|  |  |  |         expect(valueExtractor.extract(vienna.note)).toEqual("Europe"); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("extract through relation", async () => { | 
					
						
							|  |  |  |         const czechRepublic = note("Czech Republic").label("capital", "Prague"); | 
					
						
							|  |  |  |         const slovakia = note("Slovakia").label("capital", "Bratislava"); | 
					
						
							|  |  |  |         const austria = note("Austria") | 
					
						
							|  |  |  |                 .relation('neighbor', czechRepublic.note) | 
					
						
							|  |  |  |                 .relation('neighbor', slovakia.note); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         let valueExtractor = new ValueExtractor(dsc, ["note", "relations", "neighbor", "labels", "capital"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							| 
									
										
										
										
											2020-12-14 23:59:05 +01:00
										 |  |  |         expect(valueExtractor.extract(austria.note)).toEqual("Prague"); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         valueExtractor = new ValueExtractor(dsc, ["~neighbor", "labels", "capital"]); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(valueExtractor.validate()).toBeFalsy(); | 
					
						
							| 
									
										
										
										
											2020-12-14 23:59:05 +01:00
										 |  |  |         expect(valueExtractor.extract(austria.note)).toEqual("Prague"); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe("Invalid value extractor property path", () => { | 
					
						
							|  |  |  |     it('each path must start with "note" (or label/relation)', | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         () => expect(new ValueExtractor(dsc, ["neighbor"]).validate()).toBeTruthy()); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it("extra path element after terminal label", | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         () => expect(new ValueExtractor(dsc, ["~neighbor", "labels", "capital", "noteId"]).validate()).toBeTruthy()); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it("extra path element after terminal title", | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         () => expect(new ValueExtractor(dsc, ["note", "title", "isProtected"]).validate()).toBeTruthy()); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it("relation name and note property is missing", | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         () => expect(new ValueExtractor(dsc, ["note", "relations"]).validate()).toBeTruthy()); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it("relation is specified but target note property is not specified", | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         () => expect(new ValueExtractor(dsc, ["note", "relations", "myrel"]).validate()).toBeTruthy()); | 
					
						
							| 
									
										
										
										
											2020-05-25 00:25:47 +02:00
										 |  |  | }); |