ember-data-source 2.1.0.beta.2 → 2.1.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a39d5bf4d490e8b7016bd7269d40d929e1bad580
4
- data.tar.gz: a5b548fd610bd42723fe91d0d898a3d6b713598c
3
+ metadata.gz: 59e57a3230e2e71ab4c87be7cc16e699be0436a5
4
+ data.tar.gz: ae8cce053c8616100e0e89efa8ae7cddaa341706
5
5
  SHA512:
6
- metadata.gz: 481f1b778c86e2d6bb0d216a009f9d96f1aa2ee9545208f06a3db7a8b509092452f398b57ffb0eccb6e6517e898cfc0f7a3ace5830c815d9aa3c3ad809d81fab
7
- data.tar.gz: add81a1b8505b77e8fe1c6c0dfef0720c8dab0482500d21f1b7c82e35af906f81d748f92fd4e708ed8cfaa14d2178feaf27980bdbedb4fa67200dd54fb401fe7
6
+ metadata.gz: 31f0ab8615dc81bab1b40f9c0b5139af96644ed94688203a29445ad78e63ba6573390f9e7037d0f403858ca2bc0972f6d2d227e0cc78d73121c0d6b459b881bb
7
+ data.tar.gz: ffc593e02b98a555350892574a2a89ada52ca11380386cdb26e0cda027bfe474a4e0b157d667348d452ceabb4e9d29ce75c6a5d14533230dbea539e6ccb290a8
@@ -4287,7 +4287,7 @@ define(
4287
4287
  var run = Ember.run;
4288
4288
  var Person, Dog, env, store, adapter;
4289
4289
 
4290
- module("integration/adapter/store_adapter - DS.Store and DS.Adapter integration test", {
4290
+ module("integration/adapter/store-adapter - DS.Store and DS.Adapter integration test", {
4291
4291
  setup: function () {
4292
4292
  Person = DS.Model.extend({
4293
4293
  updatedAt: DS.attr('string'),
@@ -4731,7 +4731,13 @@ define(
4731
4731
  equal(type, Person, "the type is correct");
4732
4732
 
4733
4733
  if (snapshot.attr('name').indexOf('Bro') === -1) {
4734
- return Ember.RSVP.reject(new DS.InvalidError({ name: ['common... name requires a "bro"'] }));
4734
+ return Ember.RSVP.reject(new DS.InvalidError([{
4735
+ title: 'Invalid Attribute',
4736
+ detail: 'common... name requires a "bro"',
4737
+ source: {
4738
+ pointer: '/data/attributes/name'
4739
+ }
4740
+ }]));
4735
4741
  } else {
4736
4742
  return Ember.RSVP.resolve();
4737
4743
  }
@@ -4770,7 +4776,13 @@ define(
4770
4776
  test("allows errors on arbitrary properties on create", function () {
4771
4777
  adapter.createRecord = function (store, type, snapshot) {
4772
4778
  if (snapshot.attr('name').indexOf('Bro') === -1) {
4773
- return Ember.RSVP.reject(new DS.InvalidError({ base: ['is a generally unsavoury character'] }));
4779
+ return Ember.RSVP.reject(new DS.InvalidError([{
4780
+ title: "Invalid Attribute",
4781
+ detail: "is a generally unsavoury character",
4782
+ source: {
4783
+ pointer: "/data/attributes/base"
4784
+ }
4785
+ }]));
4774
4786
  } else {
4775
4787
  return Ember.RSVP.resolve();
4776
4788
  }
@@ -4816,7 +4828,13 @@ define(
4816
4828
  saveCount++;
4817
4829
 
4818
4830
  if (snapshot.attr('name').indexOf('Bro') === -1) {
4819
- return Ember.RSVP.reject(new DS.InvalidError({ name: ['common... name requires a "bro"'] }));
4831
+ return Ember.RSVP.reject(new DS.InvalidError([{
4832
+ title: 'Invalid Attribute',
4833
+ detail: 'common... name requires a "bro"',
4834
+ source: {
4835
+ pointer: '/data/attributes/name'
4836
+ }
4837
+ }]));
4820
4838
  } else {
4821
4839
  return Ember.RSVP.resolve();
4822
4840
  }
@@ -4880,7 +4898,13 @@ define(
4880
4898
  equal(type, Person, "the type is correct");
4881
4899
 
4882
4900
  if (snapshot.attr('name').indexOf('Bro') === -1) {
4883
- return Ember.RSVP.reject(new DS.InvalidError({ name: ['common... name requires a "bro"'] }));
4901
+ return Ember.RSVP.reject(new DS.InvalidError([{
4902
+ title: 'Invalid Attribute',
4903
+ detail: 'common... name requires a "bro"',
4904
+ source: {
4905
+ pointer: '/data/attributes/name'
4906
+ }
4907
+ }]));
4884
4908
  } else {
4885
4909
  return Ember.RSVP.resolve();
4886
4910
  }
@@ -4935,7 +4959,13 @@ define(
4935
4959
  };
4936
4960
  adapter.updateRecord = function (store, type, snapshot) {
4937
4961
  if (snapshot.attr('name').indexOf('Bro') === -1) {
4938
- return Ember.RSVP.reject(new DS.InvalidError({ base: ['is a generally unsavoury character'] }));
4962
+ return Ember.RSVP.reject(new DS.InvalidError([{
4963
+ title: "Invalid Attribute",
4964
+ detail: "is a generally unsavoury character",
4965
+ source: {
4966
+ pointer: "/data/attributes/base"
4967
+ }
4968
+ }]));
4939
4969
  } else {
4940
4970
  return Ember.RSVP.resolve();
4941
4971
  }
@@ -4997,7 +5027,13 @@ define(
4997
5027
  equal(type, Person, "the type is correct");
4998
5028
  saveCount++;
4999
5029
  if (snapshot.attr('name').indexOf('Bro') === -1) {
5000
- return Ember.RSVP.reject(new DS.InvalidError({ name: ['common... name requires a "bro"'] }));
5030
+ return Ember.RSVP.reject(new DS.InvalidError([{
5031
+ title: 'Invalid Attribute',
5032
+ detail: 'common... name requires a "bro"',
5033
+ source: {
5034
+ pointer: '/data/attributes/name'
5035
+ }
5036
+ }]));
5001
5037
  } else {
5002
5038
  return Ember.RSVP.resolve();
5003
5039
  }
@@ -9993,6 +10029,128 @@ define(
9993
10029
  ok(user._internalModel._relationships.has('favouriteMessage'), "Newly created record with relationships in params passed in its constructor should have relationships");
9994
10030
  });
9995
10031
  });
10032
+
10033
+ test("Related link should be fetched when no local data is present", function () {
10034
+ expect(3);
10035
+
10036
+ Book.reopen({
10037
+ author: DS.belongsTo('author', { async: true })
10038
+ });
10039
+
10040
+ env.adapter.findBelongsTo = function (store, snapshot, url, relationship) {
10041
+ equal(url, 'author', 'url is correct');
10042
+ ok(true, "The adapter's findBelongsTo method should be called");
10043
+ return Ember.RSVP.resolve({ id: 1, name: 'This is author' });
10044
+ };
10045
+
10046
+ run(function () {
10047
+ var book = env.store.push({
10048
+ data: {
10049
+ type: 'book',
10050
+ id: '1',
10051
+ relationships: {
10052
+ author: {
10053
+ links: {
10054
+ related: 'author'
10055
+ }
10056
+ }
10057
+ }
10058
+ }
10059
+ });
10060
+ book.get('author').then(function (author) {
10061
+ equal(author.get('name'), 'This is author', 'author name is correct');
10062
+ });
10063
+ });
10064
+ });
10065
+
10066
+ test("Local data should take precedence over related link", function () {
10067
+ expect(1);
10068
+
10069
+ Book.reopen({
10070
+ author: DS.belongsTo('author', { async: true })
10071
+ });
10072
+
10073
+ env.adapter.findBelongsTo = function (store, snapshot, url, relationship) {
10074
+ ok(false, "The adapter's findBelongsTo method should not be called");
10075
+ };
10076
+
10077
+ env.adapter.findRecord = function (store, type, id, snapshot) {
10078
+ return Ember.RSVP.resolve({ id: 1, name: 'This is author' });
10079
+ };
10080
+
10081
+ run(function () {
10082
+ var book = env.store.push({
10083
+ data: {
10084
+ type: 'book',
10085
+ id: '1',
10086
+ relationships: {
10087
+ author: {
10088
+ links: {
10089
+ related: 'author'
10090
+ },
10091
+ data: { type: 'author', id: '1' }
10092
+ }
10093
+ }
10094
+ }
10095
+ });
10096
+ book.get('author').then(function (author) {
10097
+ equal(author.get('name'), 'This is author', 'author name is correct');
10098
+ });
10099
+ });
10100
+ });
10101
+
10102
+ test("Updated related link should take precedence over local data", function () {
10103
+ expect(3);
10104
+
10105
+ Book.reopen({
10106
+ author: DS.belongsTo('author', { async: true })
10107
+ });
10108
+
10109
+ env.adapter.findBelongsTo = function (store, snapshot, url, relationship) {
10110
+ equal(url, 'author-updated-link', 'url is correct');
10111
+ ok(true, "The adapter's findBelongsTo method should be called");
10112
+ return Ember.RSVP.resolve({ id: 1, name: 'This is author' });
10113
+ };
10114
+
10115
+ env.adapter.findRecord = function (store, type, id, snapshot) {
10116
+ ok(false, "The adapter's findRecord method should not be called");
10117
+ };
10118
+
10119
+ run(function () {
10120
+ var book = env.store.push({
10121
+ data: {
10122
+ type: 'book',
10123
+ id: '1',
10124
+ relationships: {
10125
+ author: {
10126
+ links: {
10127
+ related: 'author'
10128
+ },
10129
+ data: { type: 'author', id: '1' }
10130
+ }
10131
+ }
10132
+ }
10133
+ });
10134
+
10135
+ env.store.push({
10136
+ data: {
10137
+ type: 'book',
10138
+ id: '1',
10139
+ relationships: {
10140
+ author: {
10141
+ links: {
10142
+ related: 'author-updated-link'
10143
+ }
10144
+ }
10145
+ }
10146
+ }
10147
+ });
10148
+
10149
+ book.get('author').then(function (author) {
10150
+ equal(author.get('name'), 'This is author', 'author name is correct');
10151
+ });
10152
+ });
10153
+ });
9996
10154
  }
9997
10155
  );
9998
10156
 
@@ -12224,6 +12382,128 @@ define(
12224
12382
  });
12225
12383
  });
12226
12384
  });
12385
+
12386
+ test("Related link should be fetched when no local data is present", function () {
12387
+ expect(3);
12388
+
12389
+ Post.reopen({
12390
+ comments: DS.hasMany('comment', { async: true })
12391
+ });
12392
+
12393
+ env.adapter.findHasMany = function (store, snapshot, url, relationship) {
12394
+ equal(url, 'comments', 'url is correct');
12395
+ ok(true, "The adapter's findHasMany method should be called");
12396
+ return Ember.RSVP.resolve([{ id: 1, body: 'This is comment' }]);
12397
+ };
12398
+
12399
+ run(function () {
12400
+ var post = env.store.push({
12401
+ data: {
12402
+ type: 'post',
12403
+ id: '1',
12404
+ relationships: {
12405
+ comments: {
12406
+ links: {
12407
+ related: 'comments'
12408
+ }
12409
+ }
12410
+ }
12411
+ }
12412
+ });
12413
+ post.get('comments').then(function (comments) {
12414
+ equal(comments.get('firstObject.body'), 'This is comment', 'comment body is correct');
12415
+ });
12416
+ });
12417
+ });
12418
+
12419
+ test("Local data should take precedence over related link", function () {
12420
+ expect(1);
12421
+
12422
+ Post.reopen({
12423
+ comments: DS.hasMany('comment', { async: true })
12424
+ });
12425
+
12426
+ env.adapter.findHasMany = function (store, snapshot, url, relationship) {
12427
+ ok(false, "The adapter's findHasMany method should not be called");
12428
+ };
12429
+
12430
+ env.adapter.findRecord = function (store, type, id, snapshot) {
12431
+ return Ember.RSVP.resolve({ id: 1, body: 'This is comment' });
12432
+ };
12433
+
12434
+ run(function () {
12435
+ var post = env.store.push({
12436
+ data: {
12437
+ type: 'post',
12438
+ id: '1',
12439
+ relationships: {
12440
+ comments: {
12441
+ links: {
12442
+ related: 'comments'
12443
+ },
12444
+ data: [{ type: 'comment', id: '1' }]
12445
+ }
12446
+ }
12447
+ }
12448
+ });
12449
+ post.get('comments').then(function (comments) {
12450
+ equal(comments.get('firstObject.body'), 'This is comment', 'comment body is correct');
12451
+ });
12452
+ });
12453
+ });
12454
+
12455
+ test("Updated related link should take precedence over local data", function () {
12456
+ expect(3);
12457
+
12458
+ Post.reopen({
12459
+ comments: DS.hasMany('comment', { async: true })
12460
+ });
12461
+
12462
+ env.adapter.findHasMany = function (store, snapshot, url, relationship) {
12463
+ equal(url, 'comments-updated-link', 'url is correct');
12464
+ ok(true, "The adapter's findHasMany method should be called");
12465
+ return Ember.RSVP.resolve([{ id: 1, body: 'This is comment' }]);
12466
+ };
12467
+
12468
+ env.adapter.findRecord = function (store, type, id, snapshot) {
12469
+ ok(false, "The adapter's findRecord method should not be called");
12470
+ };
12471
+
12472
+ run(function () {
12473
+ var post = env.store.push({
12474
+ data: {
12475
+ type: 'post',
12476
+ id: '1',
12477
+ relationships: {
12478
+ comments: {
12479
+ links: {
12480
+ related: 'comments'
12481
+ },
12482
+ data: [{ type: 'comment', id: '1' }]
12483
+ }
12484
+ }
12485
+ }
12486
+ });
12487
+
12488
+ env.store.push({
12489
+ data: {
12490
+ type: 'post',
12491
+ id: '1',
12492
+ relationships: {
12493
+ comments: {
12494
+ links: {
12495
+ related: 'comments-updated-link'
12496
+ }
12497
+ }
12498
+ }
12499
+ }
12500
+ });
12501
+
12502
+ post.get('comments').then(function (comments) {
12503
+ equal(comments.get('firstObject.body'), 'This is comment', 'comment body is correct');
12504
+ });
12505
+ });
12506
+ });
12227
12507
  }
12228
12508
  );
12229
12509
 
@@ -18228,6 +18508,24 @@ define(
18228
18508
  equal(get(user, 'handles.lastObject.nickname'), '@wycats', 'handles.lastObject.nickname is correct');
18229
18509
  });
18230
18510
  });
18511
+
18512
+ test('Warns when normalizing an unknown type', function () {
18513
+ var documentHash = {
18514
+ data: {
18515
+ type: 'UnknownType',
18516
+ id: '1',
18517
+ attributes: {
18518
+ foo: 'bar'
18519
+ }
18520
+ }
18521
+ };
18522
+
18523
+ warns(function () {
18524
+ run(function () {
18525
+ env.store.serializerFor('user').normalizeResponse(env.store, User, documentHash, '1', 'findRecord');
18526
+ });
18527
+ }, /Encountered a resource object with type "UnknownType", but no model was found for model name "unknown-type"/);
18528
+ });
18231
18529
  }
18232
18530
  );
18233
18531
 
@@ -18415,6 +18713,25 @@ define(
18415
18713
  });
18416
18714
  });
18417
18715
 
18716
+ test("serializeHasMany omits unknown relationships on pushed record", function () {
18717
+
18718
+ run(function () {
18719
+ post = env.store.push({
18720
+ id: "1",
18721
+ type: "post",
18722
+ attributes: {
18723
+ title: "Rails is omakase"
18724
+ }
18725
+ });
18726
+ });
18727
+
18728
+ var json = {};
18729
+
18730
+ env.store.serializerFor("post").serializeHasMany(post._createSnapshot(), json, { key: "comments", options: {} });
18731
+
18732
+ ok(!json.hasOwnProperty("comments"), "Does not add the relationship key to json");
18733
+ });
18734
+
18418
18735
  test("serializeIntoHash", function () {
18419
18736
  run(function () {
18420
18737
  post = env.store.createRecord('post', { title: "Rails is omakase" });
@@ -18924,6 +19241,20 @@ define(
18924
19241
  deepEqual(post.included, []);
18925
19242
  });
18926
19243
 
19244
+ test('normalizeResponse returns empty `included` payload when relationship is undefined', function () {
19245
+ env.registry.register("serializer:post", DS.JSONSerializer.extend());
19246
+
19247
+ var jsonHash = {
19248
+ id: "1",
19249
+ title: "Rails is omakase",
19250
+ comments: null
19251
+ };
19252
+
19253
+ var post = env.store.serializerFor("post").normalizeResponse(env.store, Post, jsonHash, '1', 'findRecord');
19254
+
19255
+ deepEqual(post.included, []);
19256
+ });
19257
+
18927
19258
  test('normalizeResponse respects `included` items (single response)', function () {
18928
19259
  env.registry.register("serializer:post", DS.JSONSerializer.extend(DS.EmbeddedRecordsMixin, {
18929
19260
  attrs: {
@@ -21481,7 +21812,7 @@ define(
21481
21812
  __exports__[name] = value;
21482
21813
  }
21483
21814
 
21484
- module("unit/adapter/errors - DS.AdapterError");
21815
+ module("unit/adapter-errors - DS.AdapterError");
21485
21816
 
21486
21817
  test("DS.AdapterError", function () {
21487
21818
  var error = new DS.AdapterError();
@@ -21544,18 +21875,12 @@ define(
21544
21875
  deepEqual(result, { name: ['error message'] });
21545
21876
  });
21546
21877
 
21547
- test("DS.InvalidError will normalize errors hash with deprecation", function () {
21878
+ test("DS.InvalidError will normalize errors hash will assert", function () {
21548
21879
  var error;
21549
21880
 
21550
- expectDeprecation(function () {
21881
+ expectAssertion(function () {
21551
21882
  error = new DS.InvalidError({ name: ['is invalid'] });
21552
21883
  }, /expects json-api formatted errors/);
21553
-
21554
- deepEqual(error.errors, [{
21555
- title: 'Invalid Attribute',
21556
- detail: 'is invalid',
21557
- source: { pointer: '/data/attributes/name' }
21558
- }]);
21559
21884
  });
21560
21885
  }
21561
21886
  );
@@ -23944,7 +24269,13 @@ define(
23944
24269
  updateRecord: function (store, type, snapshot) {
23945
24270
  equal(callCount, 0, "becameInvalid callback was not called until recordWasInvalid is called");
23946
24271
 
23947
- return Ember.RSVP.reject(new DS.InvalidError({ bar: 'error' }));
24272
+ return Ember.RSVP.reject(new DS.InvalidError([{
24273
+ title: "Invalid Attribute",
24274
+ detail: "error",
24275
+ source: {
24276
+ pointer: "/data/attributes/bar"
24277
+ }
24278
+ }]));
23948
24279
  }
23949
24280
  });
23950
24281
 
@@ -26956,18 +27287,21 @@ define(
26956
27287
  var get = Ember.get;
26957
27288
  var set = Ember.set;
26958
27289
  var resolve = Ember.RSVP.resolve;
26959
- var TestAdapter, store, person;
27290
+ var TestAdapter, store, person, oldFilterEnabled;
26960
27291
  var run = Ember.run;
26961
27292
 
26962
27293
  module("unit/store/adapter-interop - DS.Store working with a DS.Adapter", {
26963
27294
  setup: function () {
26964
27295
  TestAdapter = DS.Adapter.extend();
27296
+ oldFilterEnabled = Ember.ENV.ENABLE_DS_FILTER;
27297
+ Ember.ENV.ENABLE_DS_FILTER = false;
26965
27298
  },
26966
27299
  teardown: function () {
26967
27300
  run(function () {
26968
27301
  if (store) {
26969
27302
  store.destroy();
26970
27303
  }
27304
+ Ember.ENV.ENABLE_DS_FILTER = oldFilterEnabled;
26971
27305
  });
26972
27306
  }
26973
27307
  });
@@ -28176,6 +28510,38 @@ define(
28176
28510
  equal(store.peekRecord('person', 1).get('name'), 'Tom');
28177
28511
  });
28178
28512
 
28513
+ test("store should assert of the user tries to call store.filter", function () {
28514
+ expect(1);
28515
+
28516
+ var Person = DS.Model.extend({
28517
+ name: DS.attr('string')
28518
+ });
28519
+
28520
+ store = createStore({
28521
+ person: Person
28522
+ });
28523
+
28524
+ expectAssertion(function () {
28525
+ run(function () {
28526
+ store.filter('person', {});
28527
+ });
28528
+ }, /The filter API has been moved to a plugin/);
28529
+ });
28530
+
28531
+ test("Calling adapterFor with a model class should assert", function () {
28532
+ var Person = DS.Model.extend({
28533
+ name: DS.attr('string')
28534
+ });
28535
+
28536
+ store = createStore({
28537
+ person: Person
28538
+ });
28539
+
28540
+ expectAssertion(function () {
28541
+ store.adapterFor(Person);
28542
+ }, /Passing classes to store.adapterFor has been removed/);
28543
+ });
28544
+
28179
28545
  module("unit/store/adapter_interop - find preload deprecations", {
28180
28546
  setup: function () {
28181
28547
  var Person = DS.Model.extend({
@@ -29186,23 +29552,26 @@ define(
29186
29552
  }, /You tried to push data with a type 'unknown' but no model could be found with that name/);
29187
29553
  });
29188
29554
 
29189
- test('Calling push with a link containing an object throws an assertion error', function () {
29555
+ test('Calling push with a link containing an object', function () {
29190
29556
  Person.reopen({
29191
29557
  phoneNumbers: hasMany('phone-number', { async: true })
29192
29558
  });
29193
29559
 
29194
- expectAssertion(function () {
29195
- run(function () {
29196
- store.push(store.normalize('person', {
29197
- id: '1',
29198
- links: {
29199
- phoneNumbers: {
29200
- href: '/api/people/1/phone-numbers'
29201
- }
29560
+ run(function () {
29561
+ store.push(store.normalize('person', {
29562
+ id: '1',
29563
+ firstName: 'Tan',
29564
+ links: {
29565
+ phoneNumbers: {
29566
+ href: '/api/people/1/phone-numbers'
29202
29567
  }
29203
- }));
29204
- });
29205
- }, "You have pushed a record of type 'person' with 'phoneNumbers' as a link, but the value of that link is not a string.");
29568
+ }
29569
+ }));
29570
+ });
29571
+
29572
+ var person = store.peekRecord('person', 1);
29573
+
29574
+ equal(person.get('firstName'), "Tan", "you can use links containing an object");
29206
29575
  });
29207
29576
 
29208
29577
  test('Calling push with a link containing the value null', function () {
@@ -29442,12 +29811,13 @@ define(
29442
29811
  __exports__[name] = value;
29443
29812
  }
29444
29813
 
29445
- var container, store, registry;
29814
+ var container, store, registry, Person;
29446
29815
  var run = Ember.run;
29447
29816
 
29448
29817
  module("unit/store/serializer_for - DS.Store#serializerFor", {
29449
29818
  setup: function () {
29450
- var env = setupStore({ person: DS.Model.extend() });
29819
+ Person = DS.Model.extend({});
29820
+ var env = setupStore({ person: Person });
29451
29821
  store = env.store;
29452
29822
  container = store.container;
29453
29823
  registry = env.registry;
@@ -29480,6 +29850,12 @@ define(
29480
29850
  test("Calling serializerFor with a type that has not been registered and in an application that does not have an ApplicationSerializer looks up the default Ember Data serializer", function () {
29481
29851
  ok(store.serializerFor('person') instanceof DS.JSONSerializer, "serializer returned from serializerFor is an instance of DS.JSONSerializer");
29482
29852
  });
29853
+
29854
+ test("Calling serializerFor with a model class should assert", function () {
29855
+ expectAssertion(function () {
29856
+ store.serializerFor(Person);
29857
+ }, /Passing classes to store.serializerFor has been removed/);
29858
+ });
29483
29859
  }
29484
29860
  );
29485
29861
 
@@ -30257,6 +30633,13 @@ QUnit.test('ember-data/lib/system/model/states.js should pass jshint', function(
30257
30633
  assert.ok(true, 'ember-data/lib/system/model/states.js should pass jshint.');
30258
30634
  });
30259
30635
 
30636
+ }
30637
+ if (!QUnit.urlParams.nojshint) {
30638
+ QUnit.module('JSHint - ember-data/lib/system');
30639
+ QUnit.test('ember-data/lib/system/normalize-link.js should pass jshint', function(assert) {
30640
+ assert.ok(true, 'ember-data/lib/system/normalize-link.js should pass jshint.');
30641
+ });
30642
+
30260
30643
  }
30261
30644
  if (!QUnit.urlParams.nojshint) {
30262
30645
  QUnit.module('JSHint - ember-data/lib/system');