All files / lib/engine NavigationProperty.js

68.42% Statements 13/19
75% Branches 6/8
71.42% Functions 5/7
68.42% Lines 13/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126    1x                                       13x         13x     13x 13x         13x         13x                             1x 1x                 2x                                                                                 1x                     2x           1x  
"use strict";
 
const QueryableResource = require("./QueryableResource");
 
/**
 * Envelope GET/POST methods for particular Navigation Property.
 *
 * @class NavigationProperty
 * @extends {QueryableResource}
 */
class NavigationProperty extends QueryableResource {
  /**
   * Creates an instance of <code>NavigationProperty</code>.
   *
   * @param {EntitySet} source instance of the EntitySet class @see EntitySet.js
   * @param {Object} navigationProperty information about NavigationProperty
   * @param {Metadata} metadata instance of the metadata object that keeps service metadata
   *
   * @public
   * @memberof NavigationProperty
   */
  constructor(source, navigationProperty, metadata) {
    let target = navigationProperty.getTarget(
      metadata.model.getSchema(),
      source.entitySetModel
    );
    let targetElementType =
      navigationProperty.isCollection && target.entityType.elementType
        ? target.entityType.elementType
        : target.entityType;
    super(source.agent, source.metadata, target.entitySet, targetElementType);
    Object.defineProperty(this, "navigationProperty", {
      value: navigationProperty,
      writable: false,
    });
 
    Object.defineProperty(this, "source", {
      value: source,
      writable: false,
    });
 
    Object.defineProperty(this, "target", {
      value: target,
      writable: false,
    });
  }
 
  /**
   * Resets default request of the navigation property
   * and "parent" entity set also
   *
   * @memberof NavigationProperty
   *
   * @protected
   */
  reset() {
    QueryableResource.prototype.reset.call(this);
    this.source.reset();
  }
 
  /**
   * Indicates of the NavigationProperty Multiplicity is multiple or not
   * @returns {Boolean} true if the multiplicity is *
   * @memberof NavigationProperty
   */
  isMultiple() {
    return this.target.isMultiple;
  }
 
  /**
   * Gets path to the single resource
   * @returns {string} single resource path
   * @memberof NavigationProperty
   */
  getSingleResourcePath() {
    let keyProperties;
    let keyPredicate;
 
    if (this.isMultiple()) {
      keyProperties = this.keyProperties(this.defaultRequest._keyValue);
      keyPredicate = this.keyPredicate(keyProperties);
 
      return `${this.getListResourcePath()}(${keyPredicate})`;
    } else {
      return this.getListResourcePath();
    }
  }
 
  /**
   * Gets path to the list of resources
   * @returns {string} path to the list of resources
   * @memberof NavigationProperty
   */
  getListResourcePath() {
    return `${this.source.getSingleResourcePath()}/${
      this.navigationProperty.name
    }`;
  }
 
  /**
   * Creates a new Navigation Property
   * @param {Metadata} metadata instance of the metadata object that keeps service metadata
   * @param {Object} navigationProperty navigation property parsed from metadata
   * @returns {NavigationProperty} association instance @see NavigationProperty.js
   * @memberof NavigationProperty
   */
  createNavigationProperty(metadata, navigationProperty) {
    return new NavigationProperty(this, navigationProperty, metadata);
  }
 
  /**
   * Set key definiton for the entity set reading
   *
   * @return {NavigationProperty} itself for the chaining
   *
   * @memberof RequestDefinition
   */
  key() {
    return this.isMultiple()
      ? super.key.apply(this, arguments)
      : this.defaultRequest.registerAssociations();
  }
}
 
module.exports = NavigationProperty;