Eliminate PlainPatchDataTransactionUtilTest
[netconf.git] / restconf / restconf-nb / src / test / java / org / opendaylight / restconf / nb / rfc8040 / rests / transactions / NetconfRestconfStrategyTest.java
1 /*
2  * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.restconf.nb.rfc8040.rests.transactions;
9
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.verify;
14 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFailedFluentFuture;
15 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFluentFuture;
16
17 import com.google.common.util.concurrent.Futures;
18 import java.util.Optional;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.Mock;
23 import org.mockito.junit.MockitoJUnitRunner;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
26 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
27 import org.opendaylight.netconf.api.NetconfDocumentedException;
28 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
29 import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
30 import org.opendaylight.restconf.nb.rfc8040.rests.utils.PutDataTransactionUtil;
31 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
32 import org.opendaylight.yangtools.yang.common.ErrorTag;
33 import org.opendaylight.yangtools.yang.common.ErrorType;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
37 import org.w3c.dom.DOMException;
38
39 @RunWith(MockitoJUnitRunner.StrictStubs.class)
40 public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyTest {
41     @Mock
42     private NetconfDataTreeService netconfService;
43
44     @Before
45     public void before() {
46         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
47         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).discardChanges();
48         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).unlock();
49         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).lock();
50         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
51             .delete(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.of());
52     }
53
54     @Override
55     RestconfStrategy testDeleteDataStrategy() {
56         return new NetconfRestconfStrategy(netconfService);
57     }
58
59     @Override
60     RestconfStrategy testNegativeDeleteDataStrategy() {
61         doReturn(Futures.immediateFailedFuture(new TransactionCommitFailedException(
62             "Commit of transaction " + this + " failed", new NetconfDocumentedException("id",
63                 ErrorType.RPC, ErrorTag.DATA_MISSING, ErrorSeverity.ERROR)))).when(netconfService).commit();
64         return new NetconfRestconfStrategy(netconfService);
65     }
66
67     @Override
68     RestconfStrategy testPostContainerDataStrategy() {
69         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
70         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
71             .create(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
72         return new NetconfRestconfStrategy(netconfService);
73     }
74
75     @Override
76     RestconfStrategy testPostListDataStrategy(final MapEntryNode entryNode, final YangInstanceIdentifier node) {
77         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
78             .merge(any(), any(), any(), any());
79         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
80         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).create(
81             LogicalDatastoreType.CONFIGURATION, node, entryNode, Optional.empty());
82         return new NetconfRestconfStrategy(netconfService);
83     }
84
85     @Override
86     RestconfStrategy testPostDataFailStrategy(final DOMException domException) {
87         doReturn(immediateFailedFluentFuture(domException)).when(netconfService)
88             .create(any(), any(), any(), any());
89         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).discardChanges();
90         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).unlock();
91         return new NetconfRestconfStrategy(netconfService);
92     }
93
94     @Override
95     RestconfStrategy testPatchContainerDataStrategy() {
96         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).merge(any(), any(),any(),
97             any());
98         return new NetconfRestconfStrategy(netconfService);
99     }
100
101     @Override
102     RestconfStrategy testPatchLeafDataStrategy() {
103         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
104             .merge(any(), any(), any(), any());
105         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
106         return new NetconfRestconfStrategy(netconfService);
107     }
108
109     @Override
110     RestconfStrategy testPatchListDataStrategy() {
111         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
112         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
113             .merge(any(), any(),any(),any());
114         return new NetconfRestconfStrategy(netconfService);
115     }
116
117     @Test
118     public void testPutCreateContainerData() {
119         doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(JUKEBOX_IID);
120         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
121         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
122             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
123
124         PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
125             new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
126         verify(netconfService).lock();
127         verify(netconfService).getConfig(JUKEBOX_IID);
128         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
129             Optional.empty());
130     }
131
132     @Test
133     public void testPutReplaceContainerData() {
134         doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
135             .getConfig(JUKEBOX_IID);
136         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
137         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
138             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
139
140         PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
141             new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
142         verify(netconfService).getConfig(JUKEBOX_IID);
143         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
144             Optional.empty());
145     }
146
147     @Test
148     public void testPutCreateLeafData() {
149         doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(GAP_IID);
150         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
151         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
152             .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
153
154         PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new NetconfRestconfStrategy(netconfService),
155             WriteDataParams.empty());
156         verify(netconfService).getConfig(GAP_IID);
157         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
158     }
159
160     @Test
161     public void testPutReplaceLeafData() {
162         doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
163             .getConfig(GAP_IID);
164         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
165         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
166             .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
167
168         PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new NetconfRestconfStrategy(netconfService),
169             WriteDataParams.empty());
170         verify(netconfService).getConfig(GAP_IID);
171         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
172     }
173
174     @Test
175     public void testPutCreateListData() {
176         doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(JUKEBOX_IID);
177         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
178         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
179             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
180
181         PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
182             new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
183         verify(netconfService).getConfig(JUKEBOX_IID);
184         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
185             Optional.empty());
186     }
187
188     @Test
189     public void testPutReplaceListData() {
190         doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
191             .getConfig(JUKEBOX_IID);
192         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
193         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
194             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
195
196         PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
197             new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
198         verify(netconfService).getConfig(JUKEBOX_IID);
199         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
200             Optional.empty());
201     }
202 }