<NME> hasManyThroughUpsert.test.js
<BEF> var request = require("supertest");
var loopback = require('loopback')
var expect = require('chai').expect;
var JSONAPIComponent = require('../')
var RSVP = require('rsvp')

var app
var Movie, Category, MovieCategoryAssoc;

describe('hasManyThrough upsert', function () {
  beforeEach(function (done) {
var Movie, Category, MovieCategory

describe('hasManyThrough upsert', function () {
  beforeEach(function (done) {
    app = loopback()
    app.set('legacyExplorer', false)
    var ds = loopback.createDataSource('memory')
    // create models
    Movie = ds.createModel('movie', {
      id: { type: Number, id: true },
      name: String
    })

    Category = ds.createModel('category', {
      id: { type: Number, id: true },
      name: String
    })

    MovieCategory = ds.createModel('movieCategory', {
      id: { type: Number, id: true }
    })

    // add models
    app.model(Movie)
    app.model(Category)
    app.model(MovieCategory)

    // set up relationships
    MovieCategoryAssoc.belongsTo(Category)
    makeData().then(done())
    app.use(loopback.rest())
    JSONAPIComponent(app, {restApiRoot: ''})     
  })

  it('should make initial data', function (done) {
        done()
      })
      .catch(function (err) {
        done(err)
      })
    app.use(loopback.rest())
        expect(res).to.have.deep.property('body.data[0]').and.have.property('attributes.name').and.equal('Crime')
        done(err)
      })

  })

  it('should handle POST', function(done){
    var agent = request(app)
    agent
      .post('/movies')
      .send({
        "data": {
          "type": "movies",
          "attributes": {
            "name": "Ace Ventura: Pet Detective"
          },
          "relationships": {
            "categories": {
              "data": [
                {"type": "categories", "id": 4}
              ]
            }
          }
        }
      }).end(function(){
        agent.get('/movieCategoryAssocs').end(function(err, res){
          expect(err).to.equal(null)
          expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(3)
          done()
      })
      })
  })

  it('should handle PATCH', function(done){
    var agent = request(app)
    agent
      .patch('/movies/1')
      .send({
        "data": {
          "id": 1,
          "type": "movies",
          "attributes": {
            "name": "The Shawshank Redemption"
          },
          "relationships": {
            "categories": {
              "data": [
                {"type": "categories", "id": 1},
                {"type": "categories", "id": 2},
                {"type": "categories", "id": 3}
              ]
            }
          }
        }
      }).end(function(){
        agent.get('/movieCategoryAssocs').end(function(err, res){
          expect(err).to.equal(null)
          expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(3)
          done()
        }
      })
  })

  it('should handle PATCH with less assocs', function(done){
    var agent = request(app)
    agent
      .patch('/movies/1')
      .send({
        "data": {
          "id": 1,
          "type": "movies",
          "attributes": {
            "name": "The Shawshank Redemption"
          },
          "relationships": {
            "categories": {
              "data": [
                {"type": "categories", "id": 1},
                {"type": "categories", "id": 4}
              ]
            }
          }
        }
      }).end(function(err, res){
        expect(err).to.equal(null)
        agent.get('/movieCategoryAssocs').end(function(err, res){
          expect(err).to.equal(null)
          expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(2)
          
          agent.get('/movies/1/categories').end(function(err, res){
            expect(err).to.equal(null)
            expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(2)
            expect(res).to.have.deep.property('body.data[1].attributes.name').and.equal('Comedy')
        expect(res.body.data[1].id).to.equal('4')
      })
        })
      })
  })

})


function makeData (done) {
  var createMovie = denodeifyCreate(Movie)
  var createCategory = denodeifyCreate(Category)
  var createAssoc = denodeifyCreate(MovieCategoryAssoc)

  return RSVP.hash({
    movie: createMovie({ name: 'The Shawshank Redemption'}),
    categories: RSVP.all([
      createCategory({ name: 'Crime' }),
      createCategory({ name: 'Drama' }),
            categories: {
              data: [
                { type: 'categories', id: 1 },
                { type: 'categories', id: 4 }
              ]
            }
          }
        }
      })
      .end(function (err, res) {
        expect(err).to.equal(null)
  function denodeifyCreate (Model) {
    return RSVP.denodeify(Model.create.bind(Model))
  }
}
          agent.get('/movies/1/categories').end(function (err, res) {
            expect(err).to.equal(null)
            expect(res.body.data.length).to.equal(2)
            expect(res.body.data[1].attributes.name).to.equal('Comedy')
            done()
          })
        })
      })
  })
})

function makeData () {
  var createMovie = denodeifyCreate(Movie)
  var createCategory = denodeifyCreate(Category)
  var createAssoc = denodeifyCreate(MovieCategory)

  return RSVP.hash({
    movie: createMovie({ name: 'The Shawshank Redemption' }),
    categories: RSVP.all([
      createCategory({ name: 'Crime' }),
      createCategory({ name: 'Drama' }),
      createCategory({ name: 'History' }),
      createCategory({ name: 'Comedy' })
    ])
  })
    .then(function (models) {
      return RSVP.all([
        createAssoc({
          movieId: models.movie.id,
          categoryId: models.categories[0].id
        }),
        createAssoc({
          movieId: models.movie.id,
          categoryId: models.categories[2].id
        })
      ])
    })

  function denodeifyCreate (Model) {
    return RSVP.denodeify(Model.create.bind(Model))
  }
}

<MSG> style(linter): Fix styling issues

<DFF> @@ -1,11 +1,11 @@
-var request = require("supertest");
+var request = require('supertest')
 var loopback = require('loopback')
-var expect = require('chai').expect;
+var expect = require('chai').expect
 var JSONAPIComponent = require('../')
 var RSVP = require('rsvp')
 
 var app
-var Movie, Category, MovieCategoryAssoc;
+var Movie, Category, MovieCategoryAssoc
 
 describe('hasManyThrough upsert', function () {
   beforeEach(function (done) {
@@ -40,7 +40,7 @@ describe('hasManyThrough upsert', function () {
     MovieCategoryAssoc.belongsTo(Category)
     makeData().then(done())
     app.use(loopback.rest())
-    JSONAPIComponent(app, {restApiRoot: ''})     
+    JSONAPIComponent(app, {restApiRoot: ''})
   })
 
   it('should make initial data', function (done) {
@@ -53,29 +53,28 @@ describe('hasManyThrough upsert', function () {
         expect(res).to.have.deep.property('body.data[0]').and.have.property('attributes.name').and.equal('Crime')
         done(err)
       })
-
   })
 
-  it('should handle POST', function(done){
+  it('should handle POST', function (done) {
     var agent = request(app)
     agent
       .post('/movies')
       .send({
-        "data": {
-          "type": "movies",
-          "attributes": {
-            "name": "Ace Ventura: Pet Detective"
+        'data': {
+          'type': 'movies',
+          'attributes': {
+            'name': 'Ace Ventura: Pet Detective'
           },
-          "relationships": {
-            "categories": {
-              "data": [
-                {"type": "categories", "id": 4}
+          'relationships': {
+            'categories': {
+              'data': [
+                {'type': 'categories', 'id': 4}
               ]
             }
           }
         }
-      }).end(function(){
-        agent.get('/movieCategoryAssocs').end(function(err, res){
+      }).end(function () {
+        agent.get('/movieCategoryAssocs').end(function (err, res) {
           expect(err).to.equal(null)
           expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(3)
           done()
@@ -83,29 +82,29 @@ describe('hasManyThrough upsert', function () {
       })
   })
 
-  it('should handle PATCH', function(done){
+  it('should handle PATCH', function (done) {
     var agent = request(app)
     agent
       .patch('/movies/1')
       .send({
-        "data": {
-          "id": 1,
-          "type": "movies",
-          "attributes": {
-            "name": "The Shawshank Redemption"
+        'data': {
+          'id': 1,
+          'type': 'movies',
+          'attributes': {
+            'name': 'The Shawshank Redemption'
           },
-          "relationships": {
-            "categories": {
-              "data": [
-                {"type": "categories", "id": 1},
-                {"type": "categories", "id": 2},
-                {"type": "categories", "id": 3}
+          'relationships': {
+            'categories': {
+              'data': [
+                {'type': 'categories', 'id': 1},
+                {'type': 'categories', 'id': 2},
+                {'type': 'categories', 'id': 3}
               ]
             }
           }
         }
-      }).end(function(){
-        agent.get('/movieCategoryAssocs').end(function(err, res){
+      }).end(function () {
+        agent.get('/movieCategoryAssocs').end(function (err, res) {
           expect(err).to.equal(null)
           expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(3)
           done()
@@ -113,33 +112,33 @@ describe('hasManyThrough upsert', function () {
       })
   })
 
-  it('should handle PATCH with less assocs', function(done){
+  it('should handle PATCH with less assocs', function (done) {
     var agent = request(app)
     agent
       .patch('/movies/1')
       .send({
-        "data": {
-          "id": 1,
-          "type": "movies",
-          "attributes": {
-            "name": "The Shawshank Redemption"
+        'data': {
+          'id': 1,
+          'type': 'movies',
+          'attributes': {
+            'name': 'The Shawshank Redemption'
           },
-          "relationships": {
-            "categories": {
-              "data": [
-                {"type": "categories", "id": 1},
-                {"type": "categories", "id": 4}
+          'relationships': {
+            'categories': {
+              'data': [
+                {'type': 'categories', 'id': 1},
+                {'type': 'categories', 'id': 4}
               ]
             }
           }
         }
-      }).end(function(err, res){
+      }).end(function (err, res) {
         expect(err).to.equal(null)
-        agent.get('/movieCategoryAssocs').end(function(err, res){
+        agent.get('/movieCategoryAssocs').end(function (err, res) {
           expect(err).to.equal(null)
           expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(2)
-          
-          agent.get('/movies/1/categories').end(function(err, res){
+
+          agent.get('/movies/1/categories').end(function (err, res) {
             expect(err).to.equal(null)
             expect(res).to.have.deep.property('body.data').and.have.property('length').and.equal(2)
             expect(res).to.have.deep.property('body.data[1].attributes.name').and.equal('Comedy')
@@ -148,17 +147,15 @@ describe('hasManyThrough upsert', function () {
         })
       })
   })
-
 })
 
-
 function makeData (done) {
   var createMovie = denodeifyCreate(Movie)
   var createCategory = denodeifyCreate(Category)
   var createAssoc = denodeifyCreate(MovieCategoryAssoc)
 
   return RSVP.hash({
-    movie: createMovie({ name: 'The Shawshank Redemption'}),
+    movie: createMovie({name: 'The Shawshank Redemption'}),
     categories: RSVP.all([
       createCategory({ name: 'Crime' }),
       createCategory({ name: 'Drama' }),
@@ -176,4 +173,4 @@ function makeData (done) {
   function denodeifyCreate (Model) {
     return RSVP.denodeify(Model.create.bind(Model))
   }
-}
\ No newline at end of file
+}

style(linter): Fix styling issues