ember-cli-code-coverage icon indicating copy to clipboard operation
ember-cli-code-coverage copied to clipboard

Changing ED imports to @ember-data brings model coverage to 0%

Open rreckonerr opened this issue 4 years ago • 7 comments

Hi! Changing ember-data imports brings models from 100% to 0% code coverage

Test

  test("exists", function(assert) {
    const model = run(() => this.owner.lookup("service:store").createRecord("some-model"));
    assert.ok(!!model);
  });

Before (100% code coverage)

import classic from "ember-classic-decorator";
import DS from "ember-data";

const { Model, attr, hasMany, belongsTo } = DS;

@classic
export default class SomeModel extends Model {
  @belongsTo
  one;

  @hasMany
  two;

  @attr("string")
  three;

  @attr
  chaChaCha;
}

After (0% code coverage)

import classic from "ember-classic-decorator";
import Model, { attr, hasMany, belongsTo } from "@ember-data/model";

@classic
export default class SomeModel extends Model {
  @belongsTo
  one;

  @hasMany
  two;

  @attr("string")
  three;

  @attr
  chaChaCha;
}

Is this an expected behavior?

rreckonerr avatar Sep 04 '20 09:09 rreckonerr

Is this an expected behavior?

No. Can you share the transpiled output of that model file with and without COVERAGE=true set (the contents of the define statements for that one module comparing COVERAGE=true ember build vs ember build)?

rwjblue avatar Sep 04 '20 13:09 rwjblue

Seems like there's a duplication of the app name in generated path property: "/PATH_TO_MY_APP/my-app/my-app/models/some-model.js"

With coverage

define("my-app/models/some-model", [
  "exports",
  "@babel/runtime/helpers/esm/initializerDefineProperty",
  "@babel/runtime/helpers/esm/applyDecoratedDescriptor",
  "@babel/runtime/helpers/esm/initializerWarningHelper",
  "@ember-data/model"
], function(
  _exports,
  _initializerDefineProperty2,
  _applyDecoratedDescriptor2,
  _initializerWarningHelper2,
  _model
) {
  "use strict";

  var cov_2lfcqkfpc7 = (function() {
    var path = "/PATH_TO_MY_APP/my-app/my-app/models/some-model.js";
    var hash = "c02a4407864b15dd45cb0a7710e4f4fb08e4bba2";
    var global = new Function("return this")();
    var gcv = "__coverage__";
    var coverageData = {
      path: "/PATH_TO_MY_APP/my-app/my-app/models/some-model.js",
      statementMap: {},
      fnMap: {},
      branchMap: {},
      s: {},
      f: {},
      b: {},
      _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
      hash: "c02a4407864b15dd45cb0a7710e4f4fb08e4bba2"
    };
    var coverage = global[gcv] || (global[gcv] = {});

    if (coverage[path] && coverage[path].hash === hash) {
      return coverage[path];
    }

    return (coverage[path] = coverageData);
  })();

  Object.defineProperty(_exports, "__esModule", {
    value: true
  });
  _exports.default = void 0;

  var _dec,
    _class,
    _class2,
    _descriptor,
    _descriptor2,
    _descriptor3,
    _descriptor4,
    _temp;

  const classic = __EMBER_CLASSIC_DECORATOR;
  let SomeModel = ((_dec = (0, _model.attr)("string")),
  classic(
    (_class = ((_class2 = ((_temp = class SomeModel extends _model.default {
      constructor(...args) {
        super(...args);
        (0, _initializerDefineProperty2.default)(
          this,
          "one",
          _descriptor,
          this
        );
        (0, _initializerDefineProperty2.default)(
          this,
          "two",
          _descriptor2,
          this
        );
        (0, _initializerDefineProperty2.default)(
          this,
          "three",
          _descriptor3,
          this
        );
        (0, _initializerDefineProperty2.default)(
          this,
          "chaChaCha",
          _descriptor4,
          this
        );
      }
    }),
    _temp)),
    ((_descriptor = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "one",
      [_model.belongsTo],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    )),
    (_descriptor2 = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "two",
      [_model.hasMany],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    )),
    (_descriptor3 = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "three",
      [_dec],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    )),
    (_descriptor4 = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "chaChaCha",
      [_model.attr],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    ))),
    _class2))
  ) || _class);
  _exports.default = SomeModel;
});

Without coverage

define("my-app/models/some-model", [
  "exports",
  "@babel/runtime/helpers/esm/initializerDefineProperty",
  "@babel/runtime/helpers/esm/applyDecoratedDescriptor",
  "@babel/runtime/helpers/esm/initializerWarningHelper",
  "@ember-data/model"
], function(
  _exports,
  _initializerDefineProperty2,
  _applyDecoratedDescriptor2,
  _initializerWarningHelper2,
  _model
) {
  "use strict";

  Object.defineProperty(_exports, "__esModule", {
    value: true
  });
  _exports.default = void 0;

  var _dec,
    _class,
    _class2,
    _descriptor,
    _descriptor2,
    _descriptor3,
    _descriptor4,
    _temp;

  const classic = __EMBER_CLASSIC_DECORATOR;
  let SomeModel = ((_dec = (0, _model.attr)("string")),
  classic(
    (_class = ((_class2 = ((_temp = class SomeModel extends _model.default {
      constructor(...args) {
        super(...args);
        (0, _initializerDefineProperty2.default)(
          this,
          "one",
          _descriptor,
          this
        );
        (0, _initializerDefineProperty2.default)(
          this,
          "two",
          _descriptor2,
          this
        );
        (0, _initializerDefineProperty2.default)(
          this,
          "three",
          _descriptor3,
          this
        );
        (0, _initializerDefineProperty2.default)(
          this,
          "chaChaCha",
          _descriptor4,
          this
        );
      }
    }),
    _temp)),
    ((_descriptor = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "one",
      [_model.belongsTo],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    )),
    (_descriptor2 = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "two",
      [_model.hasMany],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    )),
    (_descriptor3 = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "three",
      [_dec],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    )),
    (_descriptor4 = (0, _applyDecoratedDescriptor2.default)(
      _class2.prototype,
      "chaChaCha",
      [_model.attr],
      {
        configurable: true,
        enumerable: true,
        writable: true,
        initializer: null
      }
    ))),
    _class2))
  ) || _class);
  _exports.default = SomeModel;
});

rreckonerr avatar Sep 04 '20 14:09 rreckonerr

Hi, @rwjblue ! Any updates on this one?

rreckonerr avatar Sep 08 '20 14:09 rreckonerr

Sorry for the run around here, would mind sharing the same output (with coverage vs without coverage) for the model version without decorators? I'm trying to figure out why we are missing coverage info 🤔...

rwjblue avatar Sep 08 '20 15:09 rwjblue

Useless example. Should compare global vs named import output instead. *See example in description for #292

~Output for model~

@classic
export default class Survey extends Model.extend({
  one: belongsTo(),

  two: hasMany(),

  three: attr("string"),

  chaChaCha: attr()
}) {}
~With coverage~

define("my-app/models/some-model", ["exports", "@ember-data/model"], function (
  _exports,
  _model
) {
  "use strict";

  var cov_2lfcqkfpc7 = (function () {
    var path = "/PATH_TO_MY_APP/my-app/my-app/models/some-model.js";
    var hash = "c02a4407864b15dd45cb0a7710e4f4fb08e4bba2";
    var global = new Function("return this")();
    var gcv = "__coverage__";
    var coverageData = {
      path: "/PATH_TO_MY_APP/my-app/my-app/models/some-model.js",
      statementMap: {},
      fnMap: {},
      branchMap: {},
      s: {},
      f: {},
      b: {},
      _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
      hash: "c02a4407864b15dd45cb0a7710e4f4fb08e4bba2",
    };
    var coverage = global[gcv] || (global[gcv] = {});

    if (coverage[path] && coverage[path].hash === hash) {
      return coverage[path];
    }

    return (coverage[path] = coverageData);
  })();

  Object.defineProperty(_exports, "__esModule", {
    value: true,
  });
  _exports.default = void 0;

  var _class;

  const classic = __EMBER_CLASSIC_DECORATOR;

  let SomeModel =
    classic(
      (_class = class SomeModel extends _model.default.extend({
        one: (0, _model.belongsTo)(),
        two: (0, _model.hasMany)(),
        three: (0, _model.attr)("string"),
        chaChaCha: (0, _model.attr)(),
      }) {})
    ) || _class;

  _exports.default = SomeModel;
});

~Without coverage~

define("my-app/models/some-model", ["exports", "@ember-data/model"], function (
  _exports,
  _model
) {
  "use strict";

  Object.defineProperty(_exports, "__esModule", {
    value: true,
  });
  _exports.default = void 0;

  var _class;

  const classic = __EMBER_CLASSIC_DECORATOR;

  let SomeModel =
    classic(
      (_class = class SomeModel extends _model.default.extend({
        one: (0, _model.belongsTo)(),
        two: (0, _model.hasMany)(),
        three: (0, _model.attr)("string"),
        chaChaCha: (0, _model.attr)(),
      }) {})
    ) || _class;

  _exports.default = SomeModel;
});

rreckonerr avatar Sep 08 '20 15:09 rreckonerr

@rwjblue I've added a reproduction in #292

rreckonerr avatar Sep 25 '20 16:09 rreckonerr

@rwjblue Hi! Any progress on this one?

rreckonerr avatar Dec 02 '20 12:12 rreckonerr