2019-05-01 18:09:29 +00:00
|
|
|
import { module, test } from 'qunit';
|
|
|
|
import { setupTest } from 'ember-qunit';
|
|
|
|
import { get } from 'consul-ui/tests/helpers/api';
|
2019-12-17 18:47:37 +00:00
|
|
|
import {
|
|
|
|
HEADERS_SYMBOL as META,
|
|
|
|
HEADERS_DATACENTER as DC,
|
|
|
|
HEADERS_NAMESPACE as NSPACE,
|
|
|
|
} from 'consul-ui/utils/http/consul';
|
2019-05-01 18:09:29 +00:00
|
|
|
import { createPolicies } from 'consul-ui/tests/helpers/normalizers';
|
|
|
|
|
ui: UI Release Merge (ui-staging merge) (#6527)
## HTTPAdapter (#5637)
## Ember upgrade 2.18 > 3.12 (#6448)
### Proxies can no longer get away with not calling _super
This means that we can't use create anymore to define dynamic methods.
Therefore we dynamically make 2 extended Proxies on demand, and then
create from those. Therefore we can call _super in the init method of
the extended Proxies.
### We aren't allowed to reset a service anymore
We never actually need to now anyway, this is a remnant of the refactor
from browser based confirmations. We fix it as simply as possible here
but will revisit and remove the old browser confirm functionality at a
later date
### Revert classes to use ES5 style to workaround babel transp. probs
Using a mixture of ES6 classes (and hence super) and arrow functions
means that when babel transpiles the arrow functions down to ES5, a
reference to this is moved before the call to super, hence causing a js
error.
Furthermore, we the testing environment no longer lets use use
apply/call on the constructor.
These errors only manifests during testing (only in the testing
environment), the application itself runs fine with no problems without
this change.
Using ES5 style class definitions give us freedom to do all of the above
without causing any errors, so we reverted these classes back to ES5
class definitions
### Skip test that seems to have changed due to a change in RSVP timing
This test tests a usecase/area of the API that will probably never ever
be used, it was more testing out the API. We've skipped the test for now
as this doesn't affect the application itself, but left a note to come
back here later to investigate further
### Remove enumerableContentDidChange
Initial testing looks like we don't need to call this function anymore,
the function no longer exists
### Rework Changeset.isSaving to take into account new ember APIs
Setting/hanging a computedProperty of an instantiated object no longer
works. Move to setting it on the prototype/class definition instead
### Change how we detect whether something requires listening
New ember API's have changed how you can detect whether something is a
computedProperty or not. It's not immediately clear if its even possible
now. Therefore we change how we detect whether something should be
listened to or not by just looking for presence of `addEventListener`
### Potentially temporary change of ci test scripts to ensure deps exist
All our tooling scripts run through a Makefile (for people familiar with
only using those), which then call yarn scripts which can be called
independently (for people familar with only using yarn).
The Makefile targets always check to make sure all the dependencies are
installed before running anything that requires them (building, testing
etc).
The CI scripts/targets didn't follow this same route and called the yarn
scripts directly (usually CI builds a cache of the dependencies first).
For some reason this cache isn't doing what it usually does, and it
looks as though, in CI, ember isn't installed.
This commit makes the CI scripts consistently use the same method as all
of the other tooling scripts (Makefile target > Install Deps if
required > call yarn script). This should install the dependencies if
for some reason the CI cache building doesn't complete/isn't successful.
Potentially this commit may be reverted if, the root of the problem is
elsewhere, although consistency is always good, so it might be a good
idea to leave this commit as is even if we need to debug and fix things
elsewhere.
### Make test-parallel consistent with the rest of the tooling scripts
As we are here making changes for CI purposes (making test-ci
consistent), we spotted that test-parallel is also inconsistent and also
the README manual instructions won't work without `ember` installed
globally.
This commit makes everything consistent and changes the manual
instructions to use the local ember instance that gets installed via
yarn
### Re-wrangle catchable to fit with new ember 3.12 APIs
In the upgrade from ember 3.8 > 3.12 the public interfaces for
ComputedProperties have changed slightly. `meta` is no longer a public
property of ComputedProperty but of a ComputedDecoratorImpl mixin
instead.
https://github.com/emberjs/ember.js/blob/7e4ba1096e3c2e3e0dde186d5ca52ff19cb8720a/packages/%40ember/-internals/metal/lib/computed.ts#L725
There seems to be no way, by just using publically available
methods, to replicate this behaviour so that we can create our own
'ComputedProperty` factory via injecting the ComputedProperty class as
we did previously.
https://github.com/hashicorp/consul/blob/3f333bada181aaf6340523ca2268a28d1a7db214/ui-v2/app/utils/computed/factory.js#L1-L18
Instead we dynamically hang our `Catchable` `catch` method off the
instantiated ComputedProperty. In doing it like this `ComputedProperty`
has already has its `meta` method mixed in so we don't have to manually
mix it in ourselves (which doesn't seem possible)
This functionality is only used during our work in trying to ensure
our EventSource/BlockingQuery work was as 'ember-like' as possible (i.e.
using the traditional Route.model hooks and ember-like Controller
properties). Our ongoing/upcoming work on a componentized approach to
data a.k.a `<DataSource />` means we will be able to remove the majority
of the code involved here now that it seems to be under an amount of
flux in ember.
### Build bindata_assetfs.go with new UI changes
2019-09-30 13:47:49 +00:00
|
|
|
module('Integration | Serializer | role', function(hooks) {
|
2019-05-01 18:09:29 +00:00
|
|
|
setupTest(hooks);
|
|
|
|
const dc = 'dc-1';
|
|
|
|
const id = 'role-name';
|
2019-12-17 18:47:37 +00:00
|
|
|
const undefinedNspace = 'default';
|
|
|
|
[undefinedNspace, 'team-1', undefined].forEach(nspace => {
|
|
|
|
test(`respondForQuery returns the correct data for list endpoint when nspace is ${nspace}`, function(assert) {
|
|
|
|
const serializer = this.owner.lookup('serializer:role');
|
|
|
|
const request = {
|
|
|
|
url: `/v1/acl/roles?dc=${dc}${typeof nspace !== 'undefined' ? `&ns=${nspace}` : ``}`,
|
|
|
|
};
|
|
|
|
return get(request.url).then(function(payload) {
|
|
|
|
const expected = payload.map(item =>
|
|
|
|
Object.assign({}, item, {
|
|
|
|
Datacenter: dc,
|
|
|
|
Policies: createPolicies(item),
|
|
|
|
Namespace: item.Namespace || undefinedNspace,
|
|
|
|
uid: `["${item.Namespace || undefinedNspace}","${dc}","${item.ID}"]`,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
const actual = serializer.respondForQuery(
|
|
|
|
function(cb) {
|
|
|
|
const headers = {};
|
|
|
|
const body = payload;
|
|
|
|
return cb(headers, body);
|
|
|
|
},
|
|
|
|
{
|
|
|
|
dc: dc,
|
|
|
|
ns: nspace,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
assert.deepEqual(actual, expected);
|
|
|
|
});
|
2019-05-01 18:09:29 +00:00
|
|
|
});
|
2019-12-17 18:47:37 +00:00
|
|
|
test(`respondForQueryRecord returns the correct data for item endpoint when nspace is ${nspace}`, function(assert) {
|
|
|
|
const serializer = this.owner.lookup('serializer:role');
|
|
|
|
const request = {
|
|
|
|
url: `/v1/acl/role/${id}?dc=${dc}${typeof nspace !== 'undefined' ? `&ns=${nspace}` : ``}`,
|
|
|
|
};
|
|
|
|
return get(request.url).then(function(payload) {
|
|
|
|
const expected = Object.assign({}, payload, {
|
|
|
|
Datacenter: dc,
|
|
|
|
Policies: createPolicies(payload),
|
|
|
|
[META]: {
|
|
|
|
[DC.toLowerCase()]: dc,
|
ui: Don't default to the default namespace, use the token default namespace instead (#10503)
The default namespace, and the tokens default namespace (or its origin namespace) is slightly more complicated than other things we deal with in the UI, there's plenty of info/docs on this that I've added in this PR.
Previously:
When a namespace was not specified in the URL, we used to default to the default namespace. When you logged in using a token we automatically forward you the namespace URL that your token originates from, so you are then using the namespace for your token by default. You can of course then edit the URL to remove the namespace portion, or perhaps revisit the UI at the root path with you token already set. In these latter cases we would show you information from the default namespace. So if you had no namespace segment/portion in the URL, we would assume default, perform actions against the default namespace and highlight the default namespace in the namespace selector menu. If you wanted to perform actions in your tokens origin namespace you would have to manually select it from the namespace selector menu.
This PR:
Now, when you have no namespace segment/portion in the URL, we use the token's origin namespace instead (and if you don't have a token, we then use the default namespace like it was previously)
Notes/thoughts:
I originally thought we were showing an incorrectly selected namespace in the namespace selector, but it also matched up with what we were doing with the API, so it was in fact correct. The issue was more that we weren't selecting the origin namespace of the token for the user when a namespace segment was omitted from the URL. Seeing as we automatically forward you to the tokens origin namespace when you log in, and we were correctly showing the namespace we were acting on when you had no namespace segment in the URL (in the previous case default), I'm not entirely sure how much of an issue this actually was.
This characteristic of namespace+token+namespace is a little weird and its easy to miss a subtlety or two so I tried to add some documentation in here for future me/someone else (including some in depth code comment around one of the API endpoints where this is very subtle and very hard to miss). I'm not the greatest at words, so would be great to get some edits there if it doesn't seem clear to folks.
The fact that we used to save your previous datacenter and namespace into local storage for reasons also meant the interaction here was slightly more complicated than it needed to be, so whilst we were here we rejigged things slightly to satisfy said reasons still but not use local storage (we try and grab the info from higher up). A lot of the related code here is from before we had our Routlets which I think could probably make all of this a lot less complicated, but I didn't want to do a wholesale replacement in this PR, we can save that for a separate PR on its own at some point.
2021-07-07 10:46:41 +00:00
|
|
|
[NSPACE.toLowerCase()]: nspace || '',
|
2019-12-17 18:47:37 +00:00
|
|
|
},
|
|
|
|
Namespace: payload.Namespace || undefinedNspace,
|
|
|
|
uid: `["${payload.Namespace || undefinedNspace}","${dc}","${id}"]`,
|
|
|
|
});
|
|
|
|
const actual = serializer.respondForQueryRecord(
|
|
|
|
function(cb) {
|
|
|
|
const headers = {};
|
|
|
|
const body = payload;
|
|
|
|
return cb(headers, body);
|
|
|
|
},
|
|
|
|
{
|
|
|
|
dc: dc,
|
|
|
|
ns: nspace,
|
|
|
|
id: id,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
assert.deepEqual(actual, expected);
|
2019-05-01 18:09:29 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|