Produto não precisaria receber o retorno do merge para ser que o resultado fosse "Teste 3"?
em.flush();
produto.setDescricao(“Teste 2”);
em.merge(produto); //Aqui
produto.setDescricao(“Teste 3”);
em.getTransaction().commit();
em.close();
Pq produto já tinha mudado para "detached", o merge não joga a entidade de volta para "managed", mas cria uma cópia dela em estado "managed", logo da forma como o código está ele até faria o select, mas na hora de gravar não seria feito o update no banco, pq a entidade alterada era a que estava "detached" e a descrição do prouto seria "Teste 1". Ai o código ficaria assim
...
produto = em.merge(produto);
produto.setDescricao(“Teste 3”);
em.getTransaction().commit();
em.close();