import {Cliente} from "./entity/cliente"; import "reflect-metadata"; import {closeTestingConnections, createTestingConnections, reloadTestingDatabases} from "../../utils/test-utils"; import {Connection} from "../../../src"; import {TipoCliente} from "./entity/tipo-cliente"; describe("github issue #1754 Repository.save() always updating ManyToOne relation", () => { let connections: Connection[]; before(async () => connections = await createTestingConnections({ entities: [__dirname + "/entity/*{.js,.ts}"], enabledDrivers: ["mysql"] })); beforeEach(() => reloadTestingDatabases(connections)); after(() => closeTestingConnections(connections)); it("should work as expected", () => Promise.all(connections.map(async connection => { const tipoCliente1 = new TipoCliente(); tipoCliente1.id = 1; tipoCliente1.descricao = "Mensalista"; await connection.manager.save(tipoCliente1); const tipoCliente2 = new TipoCliente(); tipoCliente2.id = 2; tipoCliente2.descricao = "XXXX"; await connection.manager.save(tipoCliente2); const cliente = new Cliente(); cliente.id = 1; cliente.nome = "Kirliam"; cliente.tipo = tipoCliente1; await connection.manager.save(cliente); // The issue happens when I receive the cliente JSON from user interface // 1. First I tried to call save() after receive the JSON let myReceivedJson1 = {id: 1, nome: "Kirliam changed 1", tipo: {id: 1, descricao: "Mensalista"}}; await connection.manager.getRepository(Cliente).save(myReceivedJson1); // 2. After I tried to preload the entity before saving. I was expecting that just // the name column to be updated, but in both cases tipoCliente is also being updated. let myReceivedJson2 = {id: 1, nome: "Kirliam changed 2", tipo: {id: 1, descricao: "Mensalista"}}; let clienteDb1: Cliente = await connection.manager.getRepository(Cliente).preload(myReceivedJson2) as Cliente; await connection.manager.getRepository(Cliente).save(clienteDb1); let myReceivedJson3 = {id: 1, nome: "Kirliam changed 3", tipo: {id: 2, descricao: "XXXX"}}; await connection.manager.getRepository(Cliente).save(myReceivedJson3); // Fail just to check the query log! // Query from log: UPDATE `cliente` SET `nome`=?, `tipoCliente`=? WHERE `id`=? -- PARAMETERS: ["Kirliam changed 2",1,1] // expect(false, "Verificar as queries!!!").is.true; }))); });