value_extractor.spec.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. const {note} = require('./becca_mocking');
  2. const ValueExtractor = require('../../src/services/search/value_extractor');
  3. const becca = require('../../src/becca/becca');
  4. const SearchContext = require("../../src/services/search/search_context");
  5. const dsc = new SearchContext();
  6. describe("Value extractor", () => {
  7. beforeEach(() => {
  8. becca.reset();
  9. });
  10. it("simple title extraction", async () => {
  11. const europe = note("Europe").note;
  12. const valueExtractor = new ValueExtractor(dsc, ["note", "title"]);
  13. expect(valueExtractor.validate()).toBeFalsy();
  14. expect(valueExtractor.extract(europe)).toEqual("Europe");
  15. });
  16. it("label extraction", async () => {
  17. const austria = note("Austria")
  18. .label("Capital", "Vienna")
  19. .note;
  20. let valueExtractor = new ValueExtractor(dsc, ["note", "labels", "capital"]);
  21. expect(valueExtractor.validate()).toBeFalsy();
  22. expect(valueExtractor.extract(austria)).toEqual("Vienna");
  23. valueExtractor = new ValueExtractor(dsc, ["#capital"]);
  24. expect(valueExtractor.validate()).toBeFalsy();
  25. expect(valueExtractor.extract(austria)).toEqual("Vienna");
  26. });
  27. it("parent/child property extraction", async () => {
  28. const vienna = note("Vienna");
  29. const europe = note("Europe")
  30. .child(note("Austria")
  31. .child(vienna));
  32. let valueExtractor = new ValueExtractor(dsc, ["note", "children", "children", "title"]);
  33. expect(valueExtractor.validate()).toBeFalsy();
  34. expect(valueExtractor.extract(europe.note)).toEqual("Vienna");
  35. valueExtractor = new ValueExtractor(dsc, ["note", "parents", "parents", "title"]);
  36. expect(valueExtractor.validate()).toBeFalsy();
  37. expect(valueExtractor.extract(vienna.note)).toEqual("Europe");
  38. });
  39. it("extract through relation", async () => {
  40. const czechRepublic = note("Czech Republic").label("capital", "Prague");
  41. const slovakia = note("Slovakia").label("capital", "Bratislava");
  42. const austria = note("Austria")
  43. .relation('neighbor', czechRepublic.note)
  44. .relation('neighbor', slovakia.note);
  45. let valueExtractor = new ValueExtractor(dsc, ["note", "relations", "neighbor", "labels", "capital"]);
  46. expect(valueExtractor.validate()).toBeFalsy();
  47. expect(valueExtractor.extract(austria.note)).toEqual("Prague");
  48. valueExtractor = new ValueExtractor(dsc, ["~neighbor", "labels", "capital"]);
  49. expect(valueExtractor.validate()).toBeFalsy();
  50. expect(valueExtractor.extract(austria.note)).toEqual("Prague");
  51. });
  52. });
  53. describe("Invalid value extractor property path", () => {
  54. it('each path must start with "note" (or label/relation)',
  55. () => expect(new ValueExtractor(dsc, ["neighbor"]).validate()).toBeTruthy());
  56. it("extra path element after terminal label",
  57. () => expect(new ValueExtractor(dsc, ["~neighbor", "labels", "capital", "noteId"]).validate()).toBeTruthy());
  58. it("extra path element after terminal title",
  59. () => expect(new ValueExtractor(dsc, ["note", "title", "isProtected"]).validate()).toBeTruthy());
  60. it("relation name and note property is missing",
  61. () => expect(new ValueExtractor(dsc, ["note", "relations"]).validate()).toBeTruthy());
  62. it("relation is specified but target note property is not specified",
  63. () => expect(new ValueExtractor(dsc, ["note", "relations", "myrel"]).validate()).toBeTruthy());
  64. });