Skip to content
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

#set with Object should work repeatedly for nested properties #592

Closed
flynnawtc opened this issue May 16, 2021 · 0 comments · Fixed by #593
Closed

#set with Object should work repeatedly for nested properties #592

flynnawtc opened this issue May 16, 2021 · 0 comments · Fixed by #593

Comments

@flynnawtc
Copy link

Version

master

Test Case

  test('#set Ember.set with Object actually does work TWICE for nested', async function (assert) {
    set(dummyModel, 'name', {});
    let title1 = { id: 'Mr', description: 'Mister' };
    let title2 = { id: 'Mrs', description: 'Missus' };
    let dummyChangeset = Changeset(dummyModel);
    set(dummyChangeset, 'name.title', title1);

    assert.equal(get(dummyModel, 'name.title.id'), undefined, 'should not have new change');
    assert.equal(dummyChangeset.name.title.id, 'Mr', 'should have new change');
    assert.equal(dummyChangeset.get('name.title.id'), 'Mr', 'should have new change using get');

    let changes = get(dummyChangeset, 'changes');
    assert.deepEqual(changes, [{ key: 'name.title', value: title1 }], 'changes with nested key Ember.set');
    //This is expected to fail but is retained to show us what is stored in changes
    assert.deepEqual(changes, [{ key: 'name.title.id', value: 'Mr' }], 'changes with nested key Ember.set');

    set(dummyChangeset, 'name.title', title2);

    assert.equal(get(dummyModel, 'name.title.id'), undefined, 'should not have new change');
    assert.equal(dummyChangeset.name.title.id, 'Mrs', 'should have new change');
    assert.equal(dummyChangeset.get('name.title.id'), 'Mrs', 'should have new change using get');

    changes = get(dummyChangeset, 'changes');
    assert.deepEqual(changes, [{ key: 'name.title', value: title2 }], 'changes with nested key Ember.set');
    //This is expected to fail but is retained to show us what is stored in changes
    assert.deepEqual(changes, [{ key: 'name.title.id', value: 'Mrs' }], 'changes with nested key Ember.set');

    dummyChangeset.execute();

    assert.equal(dummyModel.name.title.id, 'Mrs', 'has new property');
  });

  test('#set with Object should work TWICE for nested', async function (assert) {
    set(dummyModel, 'name', {});
    let title1 = { id: 'Mr', description: 'Mister' };
    let title2 = { id: 'Mrs', description: 'Missus' };
    let dummyChangeset = Changeset(dummyModel);
    dummyChangeset.set('name.title', title1);

    assert.equal(get(dummyModel, 'name.title.id'), undefined, 'should not have new change');
    assert.equal(dummyChangeset.name.title.id, 'Mr', 'should have new change');
    assert.equal(dummyChangeset.get('name.title.id'), 'Mr', 'should have new change using get');

    let changes = get(dummyChangeset, 'changes');
    assert.deepEqual(changes, [{ key: 'name.title', value: title1 }], 'changes with nested key Ember.set');
    //This is expected to fail but is retained to show us what is stored in changes
    assert.deepEqual(changes, [{ key: 'name.title.id', value: 'Mr' }], 'changes with nested key Ember.set');

    dummyChangeset.set('name.title', title2);

    assert.equal(get(dummyModel, 'name.title.id'), undefined, 'should not have new change');
    assert.equal(dummyChangeset.name.title.id, 'Mrs', 'should have new change');
    assert.equal(dummyChangeset.get('name.title.id'), 'Mrs', 'should have new change using get');

    changes = get(dummyChangeset, 'changes');
    assert.deepEqual(changes, [{ key: 'name.title', value: title2 }], 'changes with nested key Ember.set');
    //This is expected to fail but is retained to show us what is stored in changes
    assert.deepEqual(changes, [{ key: 'name.title.id', value: 'Mrs' }], 'changes with nested key Ember.set');

    dummyChangeset.execute();

    assert.equal(dummyModel.name.title.id, 'Mrs', 'has new property');
  });

Steps to reproduce

Add above tests to tests/unit/changeset-test

Essentially, when using changeset.set(key , value) where key is a nested key, and value is an object, if the value is changed more than once, then the changeset becomes corrupted resulting in invalid data in the model after changeset.execute().

Expected Behavior

In test "#set with Object should work TWICE for nested" the final assert should pass

Actual Behavior

In test "#set with Object should work TWICE for nested" the final assert fails - the change is not reflected in the model

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant