-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replication + ACLs #1202
Replication + ACLs #1202
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,90 @@ | ||||||||||||||||||||||||
describe('Remote Replication', function() { | ||||||||||||||||||||||||
beforeEach(function(done) { | ||||||||||||||||||||||||
var test = this; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
test.serverApp = loopback(); | ||||||||||||||||||||||||
test.serverApp.use(function(req, res, next) { | ||||||||||||||||||||||||
console.log(req.method, req.url); | ||||||||||||||||||||||||
next(); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
test.serverApp.use(loopback.rest()); | ||||||||||||||||||||||||
test.serverApp.enableAuth(); | ||||||||||||||||||||||||
test.clientApp = loopback(); | ||||||||||||||||||||||||
this.serverApp.set('legacyExplorer', false); | ||||||||||||||||||||||||
var settings = { | ||||||||||||||||||||||||
base: 'PersistedModel', | ||||||||||||||||||||||||
trackChanges: true, | ||||||||||||||||||||||||
dataSource: null, | ||||||||||||||||||||||||
http: { | ||||||||||||||||||||||||
path: 'my-model' | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IIRC this setting is not honoured by the remoting connector, see strongloop/loopback-connector-remote#16. Perhaps I am wrong? |
||||||||||||||||||||||||
}; | ||||||||||||||||||||||||
test.ServerModel = test.serverApp.model('ServerModel', settings); | ||||||||||||||||||||||||
test.ClientModel = test.clientApp.model('ClientModel', settings); | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You should use unique model names. Registering multiple models with the same name causes all sorts of weird behaviour. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What? They are unique... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No. This code is called before each test, and every time you call this code, a new model class is created and registered in the global static registry under the same name "ServerModel". It's safer to use a name that is unique per test, see replication tests for an example: loopback/test/replication.test.js Lines 21 to 31 in 131633f
This is not strictly necessary, in many cases it's ok to override model with the same name. It's just that the case where it's not ok are difficult to identify, because the errors are very subtle. |
||||||||||||||||||||||||
var server = test.server = this.serverApp.listen(function(err) { | ||||||||||||||||||||||||
if(err) return done(err); | ||||||||||||||||||||||||
test.port = server.address().port; | ||||||||||||||||||||||||
done(); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
afterEach(function(done) { | ||||||||||||||||||||||||
this.server.close(done); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
beforeEach(function(done) { | ||||||||||||||||||||||||
var test = this; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
test.remotes = loopback.createDataSource({ | ||||||||||||||||||||||||
connector: 'remote', | ||||||||||||||||||||||||
url: 'http://localhost:' + test.port | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
this.ClientModel.attachTo(test.remotes); | ||||||||||||||||||||||||
this.ServerModel.attachTo(loopback.createDataSource({ | ||||||||||||||||||||||||
connector: 'memory' | ||||||||||||||||||||||||
})); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
this.ClientModel.create({foo: 'bar'}, done); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
describe('client to server replication', function() { | ||||||||||||||||||||||||
it('should replicate a simple change from client to server', function(done) { | ||||||||||||||||||||||||
simpleReplication(this, done); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
describe('with access controls in place', function() { | ||||||||||||||||||||||||
beforeEach(function() { | ||||||||||||||||||||||||
this.ServerModel.settings.acls = [{ | ||||||||||||||||||||||||
"accessType": "*", | ||||||||||||||||||||||||
"principalType": "ROLE", | ||||||||||||||||||||||||
"principalId": "$everyone", | ||||||||||||||||||||||||
"permission": "DENY" | ||||||||||||||||||||||||
},{ | ||||||||||||||||||||||||
"accessType": "WRITE", | ||||||||||||||||||||||||
"principalType": "ROLE", | ||||||||||||||||||||||||
"principalId": "$authenticated", | ||||||||||||||||||||||||
"permission": "ALLOW", | ||||||||||||||||||||||||
}]; | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
it('should fail without a logged in user', function(done) { | ||||||||||||||||||||||||
simpleReplication(this, function(err) { | ||||||||||||||||||||||||
expect(err).to.exist; | ||||||||||||||||||||||||
expect(err.message).to.equal('Authorization Required'); | ||||||||||||||||||||||||
done(); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
function simpleReplication(test, done) { | ||||||||||||||||||||||||
test.ClientModel.replicate(test.ServerModel, function(err) { | ||||||||||||||||||||||||
if(err) return done(err); | ||||||||||||||||||||||||
test.ServerModel.findOne(function(err, model) { | ||||||||||||||||||||||||
expect(model.foo).to.equal('bar'); | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Magic string :( Please save the created model in the beforeeach hook and rework this check to |
||||||||||||||||||||||||
done(); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
}); | ||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps use debug logs here?
require('debug')('test')('%s %s', req.method, req.url)